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

Posted

技术标签:

【中文标题】为啥不获取 Android Firebase FCM 注册令牌?【英文标题】:Why not getting Android Firebase FCM registration token?为什么不获取 Android Firebase FCM 注册令牌? 【发布时间】:2017-03-03 14:32:54 【问题描述】:

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


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

【问题讨论】:

【参考方案1】:

主要问题是首先从您的手机中卸载您的 apk 应用程序,然后从 android studio 运行并再次构建。它对我有帮助

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

SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(getString(R.string.FCM_PREF), Context.MODE_PRIVATE);
            最终字符串令牌 = sharedPreferences.getString(getString(R.string.FCM_TOKEN),FirebaseInstanceId.getInstance().getToken());

这将确保您始终获得令牌,并且如果令牌更改,onTokenRefresh() 将被调用并且您的 SharedPreferences 将得到更新。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

How to install Google Play Services in a Genymotion VM (with no drag and drop support)?

【讨论】:

【参考方案4】:

如果您已经在清单文件中添加了该服务,那么您是对的,这是因为您的 Genymotion 模拟器 API,然后是 Check this answer

【讨论】:

以上是关于为啥不获取 Android Firebase FCM 注册令牌?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firebase 无法获取 PlayGames AuthCode 并将其传递到其凭据中?

为啥这不能检索 Firebase 存储上图像的下载 URL?

Firebase:获取当前时间而不写入数据库(IOS 和 ANDROID)

为啥 Firebase 在 Android 模拟器上运行时在 PhoneGap 应用程序中返回 404 错误?

Android Firebase 远程配置初始获取不返回值

为啥从 firebase 控制台发送的通知能够绕过 android 后台任务限制? - 反应原生火力基地 -