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

时间:2017-03-03 14:32:55

标签: android firebase firebase-cloud-messaging genymotion

我尝试从我的应用服务器向我的应用发送推送通知,但我没有通过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);
        }
    });
}
}

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

4 个答案:

答案 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

相关问题