11

J'ai une application Android qui utilise l'API de sensibilisation pour installer une clôture quand un casque est branchéAPI de sensibilisation et O Android en utilisant BroadcastReceiver

J'ai mis en œuvre le code en utilisant AwarenessFence un peu comme dans les exemples à:. https://developers.google.com/awareness/android-api/fence-register .

J'ai un PendingIntent défini comme:

PendingIntent.getBroadcast(context, 0, new Intent("my.application.packageFENCE_RECEIVER_ACTION"), 0) 

Puis dans mon dossier AndroidManifest.xml Je

<receiver android:name=".fence.FenceDetector$MyFenceReceiver"> 
<intent-filter> 
    <action android:name="my.application.packageFENCE_RECEIVER_ACTION" /> 
</intent-filter> 

Ceci est déclaré dans le manifeste en raison du fait que je Je souhaite recevoir des diffusions même lorsque mon application est en arrière-plan.

Tout cela a bien fonctionné sur Android 7.0 et ci-dessous, mais quand je lance ce sur un Android 8.0 Je reçois l'erreur:

BroadcastQueue: Background execution not allowed: receiving Intent { act=my.application.packageFENCE_RECEIVER_ACTION 

Je suppose que cela est dû aux nouvelles restrictions pour l'exécution d'arrière-plan sur Android O .

Quelqu'un peut-il me dire comment enregistrer un récepteur de radiodiffusion qui peut écouter une clôture de sensibilisation se déclenche quand en arrière-plan sur un appareil Android API en cours d'exécution 26.

Laissez-moi savoir s'il y a quelque chose qui ne sait pas ou si J'ai besoin d'élaborer méthing.

Merci à l'avance

Répondre

4

Je ne peux pas le tester sur le périphérique maintenant, mais d'après tout ce que j'ai lu, la limitation est uniquement sur les diffusions implicites. Cela signifie que si vous créez une diffusion explicite à la place, c'est tout ce dont vous avez besoin pour le faire fonctionner.

Cela signifie au lieu de ceci:

// implicit intent matching action 
PendingIntent.getBroadcast(context, 0, 
    new Intent("my.application.packageFENCE_RECEIVER_ACTION"), 0) 

vous que:

// explicit intent directly targeting your class 
PendingIntent.getBroadcast(context, 0, 
    new Intent(context, FenceDetector.MyFenceReceiver.class), 0) 
+1

Testé et travaillé. Cela devrait être la réponse acceptée, – Simon

+1

Vous avez raison Simon. Je viens de tester cela et peut confirmer que cela fonctionne. C'est maintenant la réponse acceptée. –

+0

Notez que vous devez toujours enregistrer le récepteur dans le manifeste, comme:

1

Votre compréhension est très correcte.

Apps that target Android 8.0 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. An implicit broadcast is a broadcast that does not target that app specifically.

Apps can continue to register for explicit broadcasts in their manifests.

Source

Si vous ne souhaitez que installer une clôture quand un casque est branché. Vous pouvez utiliser

Note: A number of implicit broadcasts are currently exempted from this limitation. Apps can continue to register receivers for these broadcasts in their manifests, no matter what API level the apps are targeting. For a list of the exempted broadcasts, see Implicit Broadcast Exceptions .

Vous pouvez resister pour ACTION_HEADSET_PLUG en Android Manifest. Dans onReceive, vous pouvez:

  • démarrer une NotificationManager.startServiceInForeground() afin que vous puissiez continuer à faire le travail en arrière-plan.
  • Permet de dupliquer les fonctionnalités du service avec un travail planifié. Si le service ne fait pas quelque chose immédiatement visible à l'utilisateur, vous devriez généralement pouvoir utiliser un travail planifié à la place. Référez Job Scheduler
  • Différez le travail de fond jusqu'à ce que l'application soit naturellement au premier plan.

Je suggère d'utiliser la combinaison de Job Scheduler avec ACTION_HEADSET_PLUG si long travail en cours d'exécution doit être fait.

Autre sage si une œuvre courte durée doit être fait qui onReceive vous pouvez prendre l'aide des options suivantes:

A BroadcastReceiver that uses goAsync() to flag that it needs more time to finish after onReceive() is complete. This is especially useful if the work you want to complete in your onReceive() is long enough to cause the UI thread to miss a frame (>16ms), making it better suited for a background thread.

you should not start long running background threads from a broadcast receiver. After onReceive(), the system can kill the process at any time to reclaim memory, and in doing so, it terminates the spawned thread running in the process. To avoid this, you should either call goAsync() (if you want a little more time to process the broadcast in a background thread) or schedule a JobService from the receiver using the JobScheduler, so the system knows that the process continues to perform active work.

Source

+0

Merci pour votre réponse Anurag. Cependant, j'ai besoin d'utiliser l'API Awareness car ma clôture inclut non seulement HeadsetFence mais utilise aussi DetectedActivityFence et donc je combine deux clôtures en utilisant AwarenessFence.and (DetectedActivityFence.during (DetectedActivityFence.IN_VEHICLE), HeadphoneFence.during (HeadphoneState.PLUGGED_IN)) Sinon ACTION_HEADSET_PLUG aurait été parfait. –

6

J'ai fait un peu de creuser autour et sommes tombés sur this blog post par CommonsWare. Il énonce le problème même auquel vous faites face.

Depuis le poste ci-dessus: -

One of the more controversial changes in Android O — for apps with a sufficiently-high targetSdkVersion — is the effective ban on implicit broadcasts.

Ainsi, selon cela, je ne pense pas que votre problème n'a rien à voir avec l'API de sensibilisation. Au lieu de cela, il est à cause du nouveau comportement introduit dans Android 8.

Malheureusement, cependant, il ne semble pas être une solution viable à ce que maintenant. Encore une fois, le phrasé du même poste: -

If you are receiving system-sent implicit broadcasts (e.g., ACTION_PACKAGE_ADDED), keep your targetSdkVersion at 25 or lower, until we figure out better workarounds that (hopefully) do not involve polling.

Alors, espérons qu'il y aurait une meilleure solution pour 8 dans un proche avenir. En attendant, vous pouvez envisager d'autres options ou envisager d'abaisser votre cibleSDK.

+0

Cela a fait l'affaire quand je développais mon application, mais la réponse acceptée est une meilleure solution, donc s'il vous plaît vérifier cela. –