MIUI 10 ne permet pas au service de démarrer l'activité - Xiaomi Redmi Note

9

Mon application a un service et une activité. Depuis le service, l'activité est appelée avec le code suivant:

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

même sans les drapeaux, normalement la fenêtre d'activité est affichée avec sa disposition correcte. Cependant, sur Xiaomi Redmi Note 4 avec Android 7, la disposition des activités n'est pas affichée. Je ne vois que la ligne suivante sur logcat:

I / Timeline: Timeline: Activity_launch_request time: 281438674 intention: Intent {flg = 0x30000000 cmp = com.test.app / .MainActivity}

Je pense que ce n'est pas un problème Android 7 (API 24) car sur un autre appareil avec Android 7, le service peut démarrer l'activité avec succès. Je suppose que MIUI empêche le lancement de l'activité du service.

J'ai essayé de changer la façon dont l'activité était définie dans le manifeste. J'ai également essayé avec plusieurs drapeaux différents. Tous mes tests ont échoué. Je n'ai pas réussi à démarrer l'activité. Le pire problème est qu'il n'y a aucune erreur / exception dans les journaux.

Des idées à ce sujet s'il vous plaît?

ilker Aktuna
la source
Même problème sur MIUI 11.
AlexS

Réponses:

12

Dans l'écran Informations sur l'application depuis l'application Paramètres système> Autres autorisations> Afficher les fenêtres contextuelles lors de l'exécution en arrière-plan.

Cela semble introduit dans MIUI 11.

Edit: voici un bout de code que j'utilise. J'ajoute cela dans une liste d'autorisation dans un RecyclerView.

Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
String miui = (String) get.invoke(c, "ro.miui.ui.version.name");
if (miui != null && miui.contains("11")) {
            PermissionData mPopup = new PermissionData();
            mPopup.text = "Other permissions > Display pop-up while in background";
            mPopup.onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }
            };

            mPermissionData.add(mPopup);
}

MISE À JOUR: Pour vérifier si cette autorisation est accordée, vous pouvez utiliser un service déjà en cours d'exécution et lancer une activité transparente factice, et dans le onCreaterappel sur un LocalBroadcastManagerou similaire et vous saurez qu'elle est accordée. C'est une solution laide, mais elle peut être utile pour certains.

Alex Newman
la source
Merci. c'est vraiment le problème. existe-t-il un moyen de demander cette autorisation dans l'application? ou l'ajouter par programme?
ilker Aktuna
Aucun que je sache. Je redirige vers l'écran d'informations de l'application et je leur dis d'activer cela s'ils sont sur MIUI ..
Alex Newman
mais pour ce faire, vous devez démarrer l'application. comment faites-vous ? par le biais de notifications?
ilker Aktuna
Je le fais lorsque je demande une autre autorisation requise lors de la première configuration de l'application, donc depuis l'application principale, pas un service.
Alex Newman
1
Des informations vraiment utiles pour MIUI, comme donner simplement l'autorisation de démarrer l'activité du service d'arrière-plan sans changer de code.
Panache