Récepteur de radiodiffusion ne fonctionne Pas Après le Redémarrage de l'Appareil Android

J'ai déjà vérifié toutes les questions connexes et n'ont pas trouvé de solution pour ce problème. C'est donc un absolument nouveau problème pour moi.

Ce Que J'Ai

J'ai une application Android qui enregistre quelques récepteurs de radiodiffusion dans son manifeste. C'est ce que mon manifeste ressemble.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.app.myapp">
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-feature
android:name="android.hardware.screen.portrait"
android:required="false" />
<application
android:name=".base.MyApp"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/label_app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="label, allowBackup">
<receiver android:name=".mics.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver android:name=".PhoneCallReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
<receiver
android:name=".mics.DeviceAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
</receiver>
<receiver
android:name="com.clevertap.android.sdk.InstallReferrerBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<meta-data
android:name="com.app.myapp.utils.ImageLoaderModule"
android:value="GlideModule" />
<meta-data
android:name="com.app.myapp.utils.AudioCoverLoaderModule"
android:value="GlideModule" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<activity
android:name=".core.activities.SplashActivity"
android:excludeFromRecents="true"
android:label="@string/label_app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity-alias
android:name=".core.activities.SplashActivity-Alias"
android:icon="@drawable/ic_launcher"
android:label="@string/label_app_name"
android:noHistory="true"
android:targetActivity="com.app.myapp.core.activities.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
</intent-filter>
</activity-alias>
<activity
android:name=".core.flow.authFlow.activities.AuthFlowActivity"
android:excludeFromRecents="true"
android:label="@string/label_app_name"
android:screenOrientation="portrait" />
<service android:name=".features.fileCloudSync.KillNotificationService" />
</application>
</manifest>

Il y a 10-15 aussi d'autres activités, mais ont été supprimées pour des raisons de simplicité. Et c'est la base de démarrage du récepteur de la classe. Je commence un service à partir de là.

public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
AlertUtils.showToast(context, "BOOT COMPLETED", Toast.LENGTH_LONG);
}
}
}

et le téléphone récepteur d'appel de classe ressemble à quelque chose comme ceci (il a été simplifiée (ainsi),

public class PhoneCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
AlertUtils.showToast(context, "PHONE CALL RECEIVED", Toast.LENGTH_LONG);
//Simplified for brevity
}
}
}

Le Problème

Tous ces récepteurs fonctionnent bien quand j'ai installer l'application et commencer une fois. Mais après je redémarre mon appareil ces récepteurs ne fonctionnent pas du tout. Ni le BootCompleteReceiver ni la PhoneCallReceiver obtient leur onReceive() méthode appelée.

Mon hypothèse était que ces récepteurs seraient obtenir l'enregistrement automatiquement après le redémarrage, mais il ne fonctionne tout simplement pas. J'ai besoin de la BootCompleteReceiver de travail afin que je puisse démarrer un service important dans mon application.

Mes Observations

J'ai testé ce fond. Après le redémarrage de l'appareil, les récepteurs fonctionnent très bien dans mon Nexus 5X (Nougat), Nexus 6P (Nougat), YU Yuphoria (Lollipop) mais pas dans mon OnePlus 3 (Nougat) et Mi 4i (Lollipop).

Comment le même code fonctionne parfaitement sur un grand nombre d'appareils et de ne pas fonctionner du tout sur les autres appareils? Je n'ai rien changé du tout.

Ce que je fais mal ici? Mon application est fortement dépendante de ces émissions et commence des services sur la base de ces. Toute aide sera très appréciée.

EDIT 1

De mieux comprendre le problème, je viens de créer un très petit projet de test avec juste une seule activité, et de l'exacte même BootCompleteReceiver et PhoneCallReceiver.

Mais bizarrement, ce projet fonctionne parfaitement sur mon OnePlus 3 où mon application réelle de récepteurs ne fonctionnent pas après un redémarrage. J'ai d'abord été en supposant que le problème vient de l'OS ou de l'appareil en quelque sorte, mais il ne l'est pas.

Alors, où est le problème? Est-il dans mon appli (mais il fonctionne parfaitement sur d'autres appareils) ou dans l'OS et de l'appareil (le petit projet de test fonctionne très bien sur le même OS et même appareil)?

Il est vraiment déroutant pour moi. J'aurais besoin d'une aide d'un expert sur ce sujet.

EDIT 2

J'ai essayé la suggestion donnée par @shadygoneinsane. Voici mes observations.

1) j'ai essayé d'envoyer le BOOT_COMPLETED diffusion via ADB.

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.app.myapp

Et j'ai eu cette trace de la pile,

Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED pkg=com.app.myapp }
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=25378, uid=2000
at android.os.Parcel.readException(Parcel.java:1683)
at android.os.Parcel.readException(Parcel.java:1636)
at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3696)
at com.android.commands.am.Am.sendBroadcast(Am.java:778)
at com.android.commands.am.Am.onRun(Am.java:404)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
at com.android.commands.am.Am.main(Am.java:121)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:276)

Peut-être parce que mon appareil n'est pas enracinée. Je n'arrive pas à envoyer cette diffusion, en quelque sorte.

2) j'ai essayé avec le PROCESS_OUTGOING_CALLS diffusion après que.

./adb shell am broadcast -a android.intent.action.PROCESS_OUTGOING_CALLS -p com.app.myapp

Je l'ai obtenu,

Broadcasting: Intent { act=android.intent.action.PROCESS_OUTGOING_CALLS pkg=com.app.myapp }
Broadcast completed: result=0

Il semble que l'émission a été un succès, mais je ne vois pas de pain grillé ou de n'importe quel journal. J'ai ensuite ouvert mon dialer pour composer un numéro et je peux alors voir le pain et le journal.

Il semble donc que l'envoi de la diffusion par la BAD n'a pas fonctionné, mais ouvrir le composeur et composer un numéro à fait.

MODIFIER 3

Que par la suggestion de @ChaitanyaAtkuri, j'ai aussi essayé d'ajouter la priorité à l'intention des filtres mais cela ne fonctionne pas ainsi.

J'ai utilisé des domaines prioritaires comme la 500, 999 et même la plus grande valeur entière, mais rien ne fonctionne. Ce problème se produit également dans certains de mes amis apps. Ils travaillent dans les appareils et ne fonctionne pas dans d'autres.

EDITION 4

J'ai enfin trouvé la cause racine du problème qui se passe dans mon OnePlus 3. Mon OnePlus 3 a récemment été mis à jour afin de Nougat et ils ont introduit une fonctionnalité similaire à Mi dispositifs qui empêchent certaines applications d'auto-démarrage après le redémarrage.

Lors de la désactivation de cette fonction de mes applications ont commencé à recevoir les émissions après le redémarrage parfaitement. Mais ce n'est toujours pas expliquer deux choses.

1) Mon petit projet de test est dans la liste blanche automatiquement dans la liste de Lancer des applications et c'est pourquoi il fonctionne comme prévu. Mais comment est-ce possible? Pourquoi le système d'exploitation considère cette petite application digne d'être auto-commencer?

2) Il y a certaines applications, comme LockDown Pro, 500 Firepaper qui est sur la liste noire dans le AutoLaunch écran des applications, mais encore, il reçoit les émissions après le redémarrage de mon OnePlus 3 et Mi 4i. Comment est-ce possible maintenant? Est-il possible en quelque sorte de programmation pour permettre à mon application pour le lancement automatique de ces appareils (OnePlus et Mi)?

MODIFIER 5

J'ai essayé la solution proposée par @Rahul Chowdhury et il semble vraiment très bien fonctionner. Après l'ajout de l'accessibilité des services, le problème est ré-résolu.

Mais si l'utilisateur annule l'accessibilité de l'autorisation après l'octroi de il alors est-il un moyen pour moi de programmation pour vérifier si l'accessibilité de l'autorisation est disponible sur mon application?

  • Essayez d'ajouter à la déclaration Manifeste: android:enabled="true" et android:exported="true". Également dans le coffre classe de récepteur, retirez le intent.getAction conditionnel car il n'y a pas de raison de le vérifier, car la seule fois que la diffusion se fera virer est au démarrage.
  • J'ai juste essayé de vos suggestions, et le résultat est toujours le même. En fait, ceux-ci peuvent être considérées comme des pratiques exemplaires et ne change pas la mise en œuvre d'une quelconque façon.
  • Un chemin différent. Peut-être qu'il a fait un travail et vous ne voyez pas le pain grillé. Peut-être qu'il a échoué et que vous n'avez pas la voir échouer. Modifier le code pour enregistrer quelque chose que vous pouvez détecter plus tard. Rappelez-vous récepteurs de radiodiffusion finir dans les 10 secondes ou de l'application échoue.
  • Je n'ai pas testé une fois et d'avoir posé cette question ici. Après plusieurs tests, je peux confirmer que ces récepteurs ne fonctionnent pas après un redémarrage dans certains des dispositifs mentionnés ci-dessus. Et comme vous l'avez mentionné, comment puis-je détecter si elle a échoué?
  • Avez-vous traversé cette réponse
  • Oui, j'ai déjà passé par cette réponse, mais elle n'est pas applicable ici. L'utilisateur évidemment ouvre l'application une fois et puis redémarrage de l'appareil, mais les récepteurs de radiodiffusion ne pas le feu ici. Peut-être que l'application se déplace à l'état d'arrêt en quelque sorte, mais ce n'est pas arrivé pour le petit projet de test que j'avais créé.
  • Avez-vous essayer de tester avec des commandes shell à envoyer des Émissions pour le Boot Terminé manuellement à l'aide de la BAD Essayez de l'utiliser pour tester si votre application reçoit une émission de radiodiffusion ou pas! " adb shell de radiodiffusion am -un android.l'intention.d'action.BOOT_COMPLETED -p com.mypackage."nom de l'
  • J'ai essayé ta suggestion et posté à l'observation formulée dans la question elle-même. Veuillez vérifier les et laissez-moi savoir ce qui devrait être ma prochaine étape.
  • Êtes-vous simplement en s'appuyant sur du pain grillé ou des journaux pour vérifier si l'émission a été reçu ?
  • Laissez-nous continuer cette discussion dans le chat.
  • est-ce que votre application de test ont tout service dans tout ça? Juste pour comprendre si un plus de listes blanches d'application sans services.
  • Pas de l'application de test n'ont pas de service. Mais même si j'en ajouter un, mais encore il est dans la liste blanche.
  • Veuillez vous référer à la dernière partie de ma mise à jour de réponse pour savoir si l'accessibilité du service est activé pour votre application ou pas
  • N'avez-vous pas d'avis que cette question est devenue complètement hors de contrôle? D'abord c'était une question à propos de la cause de l'échec d'une autostart; puis il s'est transformé en une question à propos de comment la ROM personnalisée sur certains appareils à choisir les applications à la liste blanche; et enfin, la question était de savoir comment traiter l'autorisation de la disponibilité, de la révocation. Il devrait être divisé en 3 questions au moins (pour ne pas mentionner que certaines de ces questions pourrait être considéré comme hors-sujet / trop large). Je ne peux même pas dire lequel de ces questions, la accepté de répondre à des adresses...
  • La accepté de répondre à des adresses fait le problème que j'ai été confronté et il est résolu. Merci.
  • veuillez vérifier ma réponse stackoverflow.com/a/42976901/909317
  • Eu le même problème. Comme mentionné, Démarrage récepteur n'ai pas touché un plus (3T) et MI appareils. Vraiment étrange était sur certains de la Cop, j'ai créé tout en essayant de cela, démarrez le récepteur a été frapper!! Mon observation est la suivante: Sur un plus 3T (et peut-être d'autres versions), si vous avez le mot "test" dans la structure du package, de démarrage du récepteur est touché. Autre chose, elle ne le fera pas!! (sons vraiment fou) Sur MI appareils, pas de "test" va aider. La même chose s'applique pour GcmNetworkManager & FirebaseJobDispatcher. Enfin, la solution retenue a sauvé moi aussi! Certains de ces éléments font que vous vous sentez de commutation de développement iOS 🙂
  • Ayant le même problème sur mon OnePlus 5.Mon petit PoC application (appelé testinator, contient un service) reçoit le BOOT_COMPLETED comme prévu, mais mon application ne fonctionne pas. Après l'arrêt d'optimisation de la batterie, à la fois les applications reçoivent le BOOT_COMPLETED intention comme prévu. Toujours à la recherche d'une meilleure solution, car je tiens à garder optimisation de la batterie sur.
  • L'enfer d'une enquête +1

InformationsquelleAutor Aritra Roy | 2017-01-07