我尝试从我的应用服务器向我的应用发送推送通知,但我没有通过FirebaseInstanceIdService
获取FCM注册令牌。在这里,我使用的是Genymotion个人版模拟器。我的模拟器API存在这个问题吗?
这里是FirebaseInstanceIdService
public class FcmInstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
String recent_token = FirebaseInstanceId.getInstance().getToken();
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.FCM_PREF), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(getString(R.string.FCM_TOKEN),recent_token);
editor.commit();
}
} 这是MainActivity
public class MainActivity extends AppCompatActivity {
String url = "http://myurl.fcm_insert.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.button2);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.FCM_PREF), Context.MODE_PRIVATE);
final String token = sharedPreferences.getString(getString(R.string.FCM_TOKEN),"");
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("Response",error.toString());
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("token",token);
return params;
}
} ;
Singletone.getSingletone(MainActivity.this).addToRequest(stringRequest);
}
});
}
}
它只将默认值发送到服务器。
答案 0 :(得分:1)
主要问题是首先从您的手机卸载您的apk应用程序然后从Android工作室再次运行和构建。这对我有帮助
如果安装了Google Play服务并且您仍然没有获得令牌,那么可能您已在生成令牌后在SharedPreferences
内实施了onTokenRefresh()
。如果重新安装应用程序,问题将自动解决。请记住,每当生成新令牌时,onTokenRefresh()
回调都会触发。因此,如果已生成令牌,则onTokenRefresh()
将不会被调用。仅当令牌已更改时onTokenRefresh()
方法才会被调用。您始终可以通过在应用程序中的任何位置调用FirebaseInstanceId.getInstance().getToken();
来获取生成的令牌值。仅对您的情况,您可以从SharedPreferences
检索令牌,如下所示: -
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.FCM_PREF), Context.MODE_PRIVATE); final String token = sharedPreferences.getString(getString(R.string.FCM_TOKEN),FirebaseInstanceId.getInstance().getToken());
这将确保您始终获取令牌,如果令牌更改onTokenRefresh()
将被调用,您的SharedPreferences
将会更新。
答案 1 :(得分:0)
这是因为Genymotion默认没有谷歌播放服务。
答案 2 :(得分:0)
在Genymotion上安装Google服务的进一步说明,仅需10分钟
How to install Google Play Services in a Genymotion VM (with no drag and drop support)?
答案 3 :(得分:0)
如果您已经在清单文件中添加了该服务,那么您是正确的,这是因为您的Genymotion模拟器API,然后Check this answer