为啥不获取 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)