wake-up-neo.com

Einige Oreo-Geräte erhalten keine Push-Benachrichtigung

Samsung S8/S5/J2/Note3 erhält Firebase Push Notification erfolgreich, entweder wird die App im Hintergrund oder im Vordergrund beendet. 

Infinix Note 5 (Android One- Oreo) und Oppo F9(Oreo) erhalten jedoch keine Push-Benachrichtigung, wenn die Anwendung beendet wird. Sie funktionieren gut, wenn sich die Anwendung im Hintergrund oder Vordergrund befindet.

Ich habe viele Artikel durchgesehen, das und das , erwähnt, dass chinesische Telefone dieses Problem haben, und es gibt einige Arbeitsseiten von Anwenderseite, damit diese Benachrichtigung auf ihrem Telefon funktioniert. 

aber ich möchte wissen, ob von der entwicklungsseite aus etwas möglich ist, um die benachrichtigung auf jedem Android-Gerät durchzuführen. 

Ich ziele auf API 27 ab, und dies ist mein Code

public class FirebaseMessagingService  extends com.google.firebase.messaging.FirebaseMessagingService {


  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        String from = remoteMessage.getFrom();
        Map data = remoteMessage.getData();

        JSONObject jsonObject = new JSONObject();
        Set<String> keys = remoteMessage.getData().keySet();
        for (String key : keys) {
            try {
                jsonObject.put(key, remoteMessage.getData().get(key));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        message= jsonObject.getString("message");

         sendNotification(message, urlToOpen);



    private void sendNotification(final String msg, final String urlToOpen) {


        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        String channelId = getString(R.string.notification_channel_general);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setSmallIcon(R.drawable.notification_icon)
                        .setContentTitle("App Name")
                        .setContentText(msg)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setPriority(Notification.PRIORITY_MAX)
                        .setContentIntent(pendingIntent);

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


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(channelId,
                    "App Channel",
                    NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
        }

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

Gradle

compileSdkVersion 27
defaultConfig {
    applicationId "com.myapp.app"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 2
    versionName "1"
    multiDexEnabled true
    testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
    vectorDrawables.useSupportLibrary = true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
    debug {
        // Disable fabric build ID generation for debug builds
        ext.enableCrashlytics = false
    }
}

implementation 'com.google.firebase:firebase-messaging:15.0.0'
implementation 'com.google.Android.gms:play-services-location:15.0.0'
implementation 'com.google.Android.gms:play-services-auth:15.0.0'
implementation 'com.google.Android.gms:play-services-basement:16.0.1'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-stats:16.0.1'
implementation 'com.google.Android.gms:play-services-tasks:16.0.1'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-ads-identifier:16.0.0'
implementation 'com.google.Android.gms:play-services-maps:16.0.0'
12
Taha Kirmani

Source: Hintergrunddienste und -jobs (oder FCM) in chinesischen ROMs aktivieren

Infinix Note 5 (Android One-Oreo) und Oppo F9 (Oreo) erhalten keine Push-Benachrichtigung, wenn die App beendet wird. Sie funktionieren problemlos, wenn sich die App im Hintergrund oder im Vordergrund befindet.

Chinesische ROMs, die (Oxygen OS, MIUI usw.) verwenden, wenn die Apps aus der letzten App-Taskleiste gezogen werden, werden mit Ihrer App beendet (ähnlich wie Force Stop). Und so wird jede Aufgabe, die im Hintergrund läuft, wie z. B. Services, mit der App abgebrochen. Selbst FCM mit hoher Priorität sieht in chinesischen ROMs nicht das Tageslicht

Echtzeitprobleme:

1) Sie können den Standort des Benutzers nicht abrufen. Daher würde keine App ordnungsgemäß funktionieren, wenn sie vom Echtzeitstandort abhängt

2) Sie können die FCM-Benachrichtigungen mit hoher Priorität nicht empfangen 

3) Keine zeitspezifische Aufgabe/kein Job wird ausgeführt, wenn sich die App nicht in der Taskleiste befindet und vieles mehr….

Lösung 

der Benutzer muss den automatischen Start in den Einstellungen für die App aktivieren, damit der Hintergrunddienst/Job aktiv bleibt. Standardmäßig ist er deaktiviert. Um dies zu tun, müssen einige der Geräte verwendet werden.

Beispielcode

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent();

        String manufacturer = Android.os.Build.MANUFACTURER;

        switch (manufacturer) {

            case "xiaomi":
                intent.setComponent(new ComponentName("com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity"));
                break;
            case "oppo":
                intent.setComponent(new ComponentName("com.coloros.safecenter",
                        "com.coloros.safecenter.permission.startup.StartupAppListActivity"));

                break;
            case "vivo":
                intent.setComponent(new ComponentName("com.vivo.permissionmanager",
                        "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
                break;
        }

      List<ResolveInfo> arrayList =  getPackageManager().queryIntentActivities(intent,
              PackageManager.MATCH_DEFAULT_ONLY);

        if (arrayList.size() > 0) {
            startActivity(intent);
        }
    }

}
7
Nilesh Rathod

Im Oreo stellen sie ein neues Konzept der Kanalisierung der Push-Benachrichtigung vor. Sie können mehr über Channelization hier lesen. Implementiere die Benachrichtigung für Oreo und oberhalb des unten genannten Erzes separat. Sie können die folgende Antwort auf das Problem beheben verweisen.

Ich habe das Problem in xamarin.Android behoben. Ich hoffe, das funktioniert für Sie. 

5
K K

Seit oreo gibt es eine neue Notification Channels-Implementierung ( in Android 8.0 (API-Ebene 26) ).

sie müssen also den Kanal mit dem folgenden Code erstellen

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "News Channel";
            String description = "Default Notification News Channel";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            NotificationManager notificationManager = getAppContext().getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }

und überschreiben Sie den Benachrichtigungs-Generator wie folgt

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getAppContext(),CHANNEL_ID);

angenommen, Sie haben den Wert von CHANNEL_ID, den Sie möchten

String CHANNEL_ID = "DEFAULT_NEWS_CHANNEL";

dies wurde bereits mit dem OnePlus3T-Gerät getestet, sodass es für Sie funktionieren sollte

4
Ashfaq Ahmed

Dies ist das Problem mit allen chinesischen Geräten. Sobald Sie die App beendet haben, wird sie aus dem Speicher entfernt und nicht alle aktiv ... aber im Fall der anderen Gerätehersteller ist dies nicht der Fall. Sie werden nicht entfernt die App komplett aus dem Speicher. Ich habe auch dieses Problem mit xiaomi-Geräten erlebt ... sie haben eine Option, um die App zu sperren, wodurch die App im Speicher bleibt, auch wenn sie zum Löschen des RAM-Speichers abgetötet wird

4
nitish29

Ich hoffe der folgende Code wird für Sie funktionieren. Es funktioniert für mich in allen Geräten.

        Intent notificationIntent = new Intent(context, SplashScreenActivity.class);

        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

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

        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence nameChannel = context.getString(R.string.app_name);
            String descChannel = context.getString(R.string.app_name);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(context.getString(R.string.app_name), nameChannel, importance);
            channel.setDescription(descChannel);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            assert notificationManager != null;
            notificationManager.createNotificationChannel(channel);
        }

        PendingIntent pendingIntent = PendingIntent.getActivity((context), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        // Create Notification
        NotificationCompat.Builder notification = new NotificationCompat.Builder(context, context.getString(R.string.app_name))
                .setChannelId(context.getString(R.string.app_name))
                .setContentTitle(TextUtils.isEmpty(title) ? getString(R.string.app_name) : title)
                .setContentText(description)
                .setTicker(context.getString(R.string.app_name))
                .setSmallIcon(R.drawable.ic_stat_name)
                .setSound(notificationSound)
                .setLights(Color.RED, 3000, 3000)
                .setVibrate(new long[]{500, 500})
                .setWhen(System.currentTimeMillis())
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);

        if (result != null) {
            notification.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(result));
        }

        assert notificationManager != null;
        notificationManager.notify(100, notification.build());

Ich habe gerade einen Benachrichtigungskanal erstellt, ob Bedingung für Oreo geprüft wird.

Lassen Sie mich wissen, wenn Sie Probleme haben. Ich bin hier, um dir zu helfen.

Vielen Dank.

3
Pratik Butani

Ich hatte dasselbe Problem und nach dem Durchsuchen und Umgehen von Ich habe festgestellt, dass der Benutzer die Berechtigung zum automatischen Start und zur Batterieoptimierung manuell aktivieren muss Weitere Informationen finden Sie in this link

0
amin pinjari