为什么不获得Android Firebase FCM注册令牌?

为什么不获得Android Firebase FCM注册令牌?,android,firebase,firebase-cloud-messaging,genymotion,Android,Firebase,Firebase Cloud Messaging,Genymotion,我正试图从我的应用服务器向我的应用发送推送通知,但我没有通过FirebaseInstancedService获取FCM注册令牌。这里我使用的是Genymotion personal edition emulator。我的模拟器API有问题吗 这是FirebaseInstancedService public class FcmInstanceIdService extends FirebaseInstanceIdService { @Override public void onTokenRe

我正试图从我的应用服务器向我的应用发送推送通知,但我没有通过
FirebaseInstancedService
获取FCM注册令牌。这里我使用的是Genymotion personal edition emulator。我的模拟器API有问题吗

这是FirebaseInstancedService

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();
}
} 这里是主要活动

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);
        }
    });
}
}
public类MainActivity扩展了AppCompatActivity{
字符串url=”http://myurl.fcm_insert.php";
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮bt=(按钮)findViewById(R.id.button2);
bt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
SharedReferences SharedReferences=getApplicationContext().GetSharedReferences(getString(R.string.FCM_PREF),Context.MODE_PRIVATE);
final-String-token=SharedReferences.getString(getString(R.String.FCM_-token),“”);
StringRequest StringRequest=new StringRequest(Request.Method.POST,url,new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
Toast.makeText(MainActivity.this,“Success”,Toast.LENGTH_SHORT.show();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.d(“Response”,error.toString());
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT.show();
}
})
{
@凌驾
受保护的映射getParams()引发AuthFailureError{
Map params=新的HashMap();
参数put(“令牌”,令牌);
返回参数;
}
} ;
Singletone.getSingletone(MainActivity.this).addToRequest(stringRequest);
}
});
}
}

它只是将默认值发送到服务器。

这是因为Genymotion默认没有google play服务。

按照进一步说明在Genymotion上安装google服务,只需10分钟


如果您已经在清单文件中添加了该服务,那么您是对的,因为您使用了Genymotion模拟器API,那么主要问题是首先从手机上卸载您的apk应用程序,然后从android studio重新运行和构建。这对我有帮助

如果安装了google play服务,但您仍然没有获得令牌,那么您可能已经在生成令牌后在
onTokenRefresh()内部实现了
SharedReferences
。如果重新安装应用程序,问题将自动解决。请记住,每当生成新令牌时,就会触发
onTokenRefresh()
回调。因此,如果令牌已经生成,
onTokenRefresh()
将不会被调用。只有当令牌已更改时才会调用
onTokenRefresh()
方法。通过调用
FirebaseInstanceId.getInstance().getToken()始终可以获得生成的令牌值几乎在应用程序中的任何位置。对于您的情况,您只能从
SharedReferences
检索令牌,如下所示:-

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()); SharedReferences SharedReferences=getApplicationContext().GetSharedReferences(getString(R.string.FCM_PREF),Context.MODE_PRIVATE); final String token=SharedReferences.getString(getString(R.String.FCM_token),FirebaseInstanceId.getInstance().getToken()); 这将确保您始终获得令牌,并且如果令牌更改,将调用
onTokenRefresh()
,并更新您的
SharedReferences