ログのMainActivity
で、FirebaseInstanceId.getInstance().getToken()
を使用してトークンを確認し、生成されたトークンを表示します。しかし、それがMyFirebaseInstanceIDService
に拡張されるFirebaseInstanceIdService
では、onTokenRefresh()
は呼び出されないようです。この関数では、トークンは最初にここで生成されると言われています。 sendRegistrationToServer()
を呼び出す必要があったので、それがonTokenRefresh()
に入らない理由を知りたいのです。
ここに私のコードがあります
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
sendRegistrationToServer(refreshedToken);
}
}
firebaseInstanceIdServiceのonTokenRefreshは、新しいトークンが生成されたときにのみ呼び出されます。アプリが以前にインストールされてトークンを生成した場合、onTokenRefreshは呼び出されません。アプリをアンインストールして再インストールし、新しいトークンを強制的に生成してみてください。これにより、onTokenRefreshが呼び出されます。
また、FirebaseInstanceIdServiceがAndroidManifest.xmlで適切に定義されていることを確認してください
マニフェストファイル内。
<service
Android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService"
Android:exported="false">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
Android:name="com.bnt.etailers.fcm.GCMNotificationIntentService"
Android:exported="false">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
FirebaseInstanceIdServiceクラス
public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName();
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
if (refreshedToken!=null) {
SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken);
}
// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
}}
FirebaseMessagingServiceクラス。
public class GCMNotificationIntentService extends FirebaseMessagingService {
// Sets an ID for the notification, so it can be updated
public GCMNotificationIntentService() {
super();
}
@Override
public void onMessageReceived(RemoteMessage message) {
}}
私はあなたと同じ問題を抱えていました。私の間違いは次のとおりです:AndroidManifest.xmlファイルの<service>
タグを<application>
タグの外側に配置しました。
今、私は次のようになります:
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<service
Android:name=".MyFirebaseMessagingService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
Android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
</application>
そして、それは問題なく動作します。
はい、これは時々起こるかもしれません。
Fcm idを取得したい場所で次のメソッドを呼び出してください。
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
最初にデバイスまたはエミュレーターからアンインストールして、アプリを再インストールしてください。その後、新しいトークンが生成されるため、onTokenRefresh()が再度呼び出されます。
私の場合、マニフェストにインターネット許可を追加するのを忘れましたが、
<uses-permission Android:name="Android.permission.INTERNET" />
ほとんどの人がこの間違いをしないことを願っています。
追加したことを確認してください
プラグインの適用: 'com.google.gms.google-services'
これをapp.gradleファイルの最後まで
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
onCreate
メソッドでトークンを削除します。
再インストールは私のためのトリックをしました!
インターネット接続が利用できないデバイスでアプリケーションを実行しているとき、MyFirebaseInstanceIDServiceが呼び出されないことを経験しました。この方法では、onTokenRefresh()は呼び出されません。更新されたFirebaseTokenを取得するには、アプリケーションの実行中にデバイスがインターネットに接続している必要があります。
また、以前のアプリをアンインストールします-再インストール更新されたトークンを取得するために。登録トークンは次の場合に変更されます。
1)アプリはインスタンスIDを削除します
2)アプリは新しいデバイスに復元されます
3)ユーザーがアプリをアンインストール/再インストールする
4)ユーザーがアプリのデータを消去します。
私の場合、すべてを試しましたが、onTokenRefresh
は呼び出されませんでした。次に、WiFiを変更し、別のnetworkに接続します。以前のWiFiのインターネット接続は良好です。なぜ発生したのかわかりません。これは誰かを助けることができるかもしれません。
呼び出されていないonTokenRefreshを呼び出さない理由はいくつかあります。私はそれをリストして、一つ一つ言及しました。
インターネット許可が追加されていることを確認してください
プロジェクトのアプリディレクトリ内のGoogleコンソールから生成するgoogle-services.jsonファイルを追加したことを確認してください
apply plugin: 'com.Android.application' Android { // ... } dependencies { // ... implementation 'com.google.firebase:firebase-core:16.0.4' // Getting a "Could not find" error? Make sure you have // added the Google maven respository to your root build.gradle } // ADD THIS AT THE BOTTOM apply plugin: 'com.google.gms.google-services'
4)プロジェクトレベルのbuild.gridleファイルに再生サービスクラスパスを追加する
buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:4.1.0' // google-services plugin } } allprojects { // ... repositories { // ... google() // Google's Maven repository } }
5)アプリケーションタグ内のAndroidManifesファイルにこれらのサービスが追加されていることを確認してください
<service Android:name=".MyFirebaseMessagingService"> <intent-filter> <action Android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service Android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application>
6)トークンの更新時および最初のアプリのインストール時にonToken更新が呼び出されるため、アプリを手動で削除するか、データをクリアしてください。
7)サービスクラスでFirebaseMessagingServiceを拡張していることを確認します
私はそれと1時間以上苦労していましたが、次のコードを変更すると突然動作しました。
refreshedTokenを次のように処理します。
String refreshedToken;
try {
refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
Localytics.setPushRegistrationId(refreshedToken);
} catch (Exception e) {
Log.d(TAG, "Refreshed token, catch: " + e.toString());
e.printStackTrace();
}
Android:exported = "true">をマニフェストのMyFirebaseMessagingServiceとMyFirebaseInstanceIDServiceの両方に追加してみてください。
<service
Android:name="com.localytics.Android.sample.fcm.MyFirebaseMessagingService"
Android:exported="true">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
Android:name="com.localytics.Android.sample.fcm.MyFirebaseInstanceIDService"
Android:exported="true">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
アプリをアンインストールして、もう一度インストールしてください。実際のデバイスでテスト済み。
Android:exported = "true"はデフォルトのオプションであるため、完全に削除することもでき、trueに設定されます。
また、onTokenRefreshをより明示的に呼び出す場合は、コード内のどこでも簡単に呼び出すことができます。
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);
放送の受信に依存する必要はもうありません
同じ問題がありました。私のデバイス(KitKat 4.4.2)は、何らかの理由でonTokenRefresh()を取得できませんでした。私のインターネット接続は完璧で、グーグルプレイサービスは最新で、firebaseが機能するために必要な条件はすべて満たされていました。私のコードは、デバイス5.0.0以降で完全に機能しました。この問題を解決するには、デバイスを工場出荷時の設定にリセットする必要があり、アプリケーションが動作し始めました。私はそれが厳しい尺度であることを知っていますが、おそらくそれは誰かを助けるかもしれません。 onTokenRefresh()が呼び出されない原因となるいくつかの問題または他のアプリケーションとの競合が存在する必要があります。がんばろう!