1

Ich habe Probleme beim Aktualisieren von Token in Firebase. Ich bin durch die Dokumentation gegangen und habe genau die Schritte von android verfolgt. In meinem Protokoll finde ich die Verbindung zum Firebase als erfolgreich. Ich bin mir nicht sicher, warum ich den Instanz-Token nicht bekomme. Ich bin in der Anfangsphase und versuche, das Token in logcat zu bekommen.Nicht aktualisiert Token Firebase android

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.project.application" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="9" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <application 
     android:allowBackup="false" 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".ProjectName" 
      android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
      android:icon="@drawable/icon" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Light.NoTitleBar"> 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <meta-data 
       android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version" /> 
     </activity> 

     <service 
      android:name=".MyInstanceIDListenerService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> 
      </intent-filter> 
     </service> 

     <service 
      android:name=".MyFirebaseInstanceIDService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
      </intent-filter> 
     </service>  
    </application> 

</manifest> 

    public class MyInstanceIDListenerService extends FirebaseInstanceIdService{  
    private static final String TAG = "MyFirebaseIIDService"; 
    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

     Log.d(TAG, "Refreshed token: " + refreshedToken); 
     sendRegistrationToServer(refreshedToken); 

    } 

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

private static final String TAG = "MyFirebaseMsgService"; 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    // TODO(developer): Handle FCM messages here. 

    Log.d(TAG, "From: " + remoteMessage.getFrom()); 
    String messageBody = null; 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    if (remoteMessage.getNotification() != null) { 
     messageBody = remoteMessage.getNotification().getBody(); 
     Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
    } 

    sendNotification(messageBody); 

} 
private void sendNotification(String messageBody) { 
    Intent intent = new Intent(this, SplashActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_stat_ic_notification) 
      .setContentTitle("FCM Message") 
      .setContentText(messageBody) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
} 

}

+0

Token nur einmal generieren. Sie müssen Ihre App-Daten löschen, um ein neues Push-Token zu erhalten. – ZeroOne

+0

Ich habe nicht mal ein einziges Mal wenn ich dich richtig verstanden habe. Ich habe die Schritte in Firebase andriod verfolgt und ich habe den Token in log erwartet. Aber ich kann diesen Log.d (TAG, "Refreshed token:" + refreshedToken) überhaupt nicht sehen. Ich sollte zumindest das Log mit "Refreshed Token" bekommen. Aber dafür gibt es im Protokoll keine Aufzeichnung. – jenny

+0

hast du den Dienst mit 'startService (neue Absicht (this, MyFirebaseMessagingService.class)) gestartet;' –

Antwort

6

Die Methode onTokenRefresh() löst nicht aus, wenn eine App zum ersten Mal installiert wird. Es wird nur von specific scenarios ausgelöst.

Um Ihr Token zu erhalten, müssen Sie FirebaseInstanceId.getInstance().getToken() beim Start Ihrer App anrufen (wie in onCreate oder etwas).

+0

Ich bekomme Token, wenn ich in create. Aber immer noch nicht die Benachrichtigung Nachricht von Firebase-Konsole. – jenny

+0

@jenny Können Sie Ihren Android-Seitencode zum Empfangen der Nachricht posten? –

+0

Ich habe meinen Messaging-Service-Code aktualisiert. Ich bin immer noch nicht in der Lage, eine Benachrichtigung im Handy zu bekommen, obwohl ich im Protokoll komme. – jenny

1

reparieren Ihre Erlaubnis

<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

Stellen Sie sicher, korrekte Google-service.json haben.

Hinweis: Token wird nur einmal generiert. versuchen, App-Daten zu reinigen, um neue Token

EDIT zu erhalten:

Oder Sie können Iteration tun Token manuell in Ihrer Aktivität/Fragment Klasse erhalten

FirebaseInstanceId iid = FirebaseInstanceId.getInstance(); 
String token = iid.getToken(); 

while(token == null){ 
    iid = FirebaseInstanceId.getInstance(); 
    token = iid.getToken(); 
} 

Logger.info("TOKEN","==>"+token); 
1

Vom Github-Projekt von FCMhere

Die Dokumentation onTokenRefresh() lautet:

  • Wird aufgerufen, wenn InstanceID-Token aktualisiert wird. Dies kann auftreten, wenn die Sicherheit des vorherigen Tokens beeinträchtigt wurde. Beachten Sie, dass dies aufgerufen wird, wenn das InstanceID-Token anfänglich generiert wird, sodass Sie das Token abrufen würden.

Sie müssen Clear Cache von Ihnen App oder installieren Sie es, um diese Methode zu nennen.

0

Versuchen Sie, die Datei google-services.json zu löschen und erneut hinzuzufügen.

Verwandte Themen