Android hintergrund-Benachrichtigungen mit FB Cloud Messaging nicht erhalten

Ich gesucht habe viel über Benachrichtigungen, wenn die app im hintergrund oder geschlossen ist. Ich bin mit FB Cloud-Messaging durch die Art und Weise. Es wird nicht für mich arbeiten. Ich habe das Android setup und wenn die app im Vordergrund ist oder das Telefon nicht gesperrt ist, wird die Benachrichtigung erhalten.

  • Installiert, wenn das token korrekt gedruckt und abonniert das Thema.
  • Wenn ich eine Benachrichtigung senden, wenn die app ist aktiv in den Vordergrund (also Bildschirm wird entsperrt und die app wird angezeigt) ich habe die Benachrichtigung erhalten, und Titel wie bereits in der onMessageReceived.
  • Wenn ich eine Benachrichtigung senden, wenn die app ist nicht gezeigt aber noch im "Letzte apps" und der Bildschirm ist freigeschaltet erhalte ich die Meldung mit Titel und Nachricht wie bereits in notification payload.
  • Wenn ich eine Benachrichtigung senden, wenn die app ist nicht gezeigt aber noch im "Letzte apps" und der Bildschirm ist gesperrt nichts empfangen wird.
  • Wenn ich eine Benachrichtigung senden, wenn die app ist *geschlossen und entfernt von den letzten apps nichts empfangen wird.

Wie kann ich dies ändern, damit die app immer die Benachrichtigungen erhalten, auch wenn Sie geschlossen oder das Telefon gesperrt ist?

Ps. Ich lese über den Doze-modus mit geschützten apps, auch wenn ich meine app mit dem geschützten, von denen ich nichts bekommen. Ich bin den Test auf einem Huawei P8 Lite.

AndroidManifest

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity android:name=".activities.MainActivity"
        android:configChanges="orientation"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        android:name=".services.MyAppFirebaseMessagingService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name=".services.FirebaseIDService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <receiver android:name=".services.NotificationReceiver" />
</application>

Gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.google.firebase:firebase-core:9.2.0'
    compile 'com.google.firebase:firebase-messaging:9.2.0'
}

apply plugin: 'com.google.gms.google-services'

FirebaseMessagingService

public class MyAppFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "FCM Service";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //TODO: Handle FCM messages here.
        //If the application is in the foreground handle both data and notification messages here.
        //Also if you intend on generating your own notifications as a result of a received FCM
        //message, here is where that should be initiated.
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());

        showNotification(getApplicationContext());
    }

    public static void showNotification(Context context){
        Intent intent = new Intent(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("FCM Message")
            .setContentText("FCM Body")
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setPriority(Notification.PRIORITY_MAX)
            .setContentIntent(pendingIntent);

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

        notificationManager.notify(0, notificationBuilder.build());
    }
}

FirebaseInstanceIDService

public class FirebaseIDService extends FirebaseInstanceIdService {

    private static final String TAG = "FirebaseIDService";

    @Override
    public void onTokenRefresh() {
        //Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        System.out.println("Devicetoken: " + refreshedToken);

        FirebaseMessaging.getInstance().subscribeToTopic("/topics/myapp");

        //TODO: Implement this method to send any registration to your app's servers.
        sendRegistrationToServer(refreshedToken);
     }

    /**
     * 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.
    }
}

Notification payload

{
    "to": "/topics/mytopic",
    "priority": "high",
    "notification": {
        "sound": "default",
        "badge": "1",
        "body": "the body text",
        "title": "title text"
     },
     "data": {
         "id": "id",
         "channel": "channel"
     }
}

BEARBEITEN - Hinzufügen von code für WakeFulBroadcastReceiver

public class NotificationReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        //cancel any further alarms
        AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        alarmMgr.cancel(alarmIntent);
        completeWakefulIntent(intent);

        //start the GcmTaskService
        MyAppFirebaseMessagingService.showNotification(context);
    }
}

UPDATE NUTZLAST

Wenn ich meine Beute auf die vorgeschlagene Weise in die Kommentare wie diesen ist es immer noch nicht funktioniert. Vielleicht hat es etwas zu tun mit dem Huawei P8 Lite, das Teste ich auf mit Android 6.0.1 installiert.

{
    "to": "/topics/mytopic",
    "priority": "high",
    "data": {
        "sound": "default",
        "badge": "1",
        "body": "the body text",
        "title": "title text"
    }
}

UPDATE 2.0

Habe ich getestet auf mehreren Geräten und Versionen. Auf Geräten mit Android 5 es war in Ordnung arbeiten, auch ohne die app geöffnet und der Bildschirm gesperrt. Nur Gerät es nicht funktioniert war meine eigene Huawei P8 Lite. Noch kann nicht herausfinden, warum es nicht funktioniert, dass man auf.

  • Möglich duplicate (ich habe nie mit der neuen FB Cloud-Messaging, aber in GCM benötigen Sie ein WakefulBroadcastReceiver, mit WakeLock-Berechtigung und-Empfänger im manifest deklariert zu erhalten, wenn die app ausgeschaltet ist)
  • Ich versuchte das auch, ich meine aktualisierten code.
  • Jesus, warum Sie eine name-Empfänger "Service"? Viel Glück, halten mit Ihrem eigenen code.
  • Woops, ändern wir das. Aber immer noch kein Glück 🙁
  • Sie nicht brauchen, um zu verwalten wakelocks wenn Ihre Arbeit ist schnell, verarbeitet und innerhalb onMessageReceived. Erhalt einer push-Nachricht weckt das Gerät automatisch. Das ist der Punkt, der eine push-Nachricht, richtig?
  • Das ist, was ich dachte, aber apperently es nicht. Nichts ist empfangen, wenn der Bildschirm gesperrt ist.
  • Wenn die Nutzdaten der Benachrichtigung enthält "Benachrichtigung", onMessageReceived wird nur aufgerufen werden, wenn die app im Vordergrund. Wenn es im hintergrund eine notification wird erstellt und geschrieben für Sie von Google-Play-Dienste gemäß der "notification" - Nutzlast.
  • Ich habe gelesen, dass nun, ändern Sie Ihre Benachrichtigungs-Nutzlast auf eine Daten-Nutzlast
  • Wenn ich meine Nutzlast {"to": "/topics/mytopic","priority": "high","data": {"sound": "default","badge": "1","body": "the body text","title": "title text"}} es funktioniert immer noch nicht. Oder ist dieser Auftrag nicht das richtige format?
  • entfernen Sie die Meldung " tag aus Ihrer Nutzlast
  • Ich habe die payload und ich erhalte die Meldungen nur, wenn der Bildschirm nicht gesperrt ist.
  • Weiß nicht, ob dieses Problem kann gelöst werden, indem der Entwickler: Siehe f.e.: forbes.com/sites/bensin/2016/07/04/... ich habe dasselbe Problem mit meinem huawei-Gerät. Meine anderen Geräte empfangen Benachrichtigungen Prima

InformationsquelleAutor Tom Spee | 2016-09-28
Schreibe einen Kommentar