2015-12-14 6 views
6

Ich habe eine schwere Zeit, den richtigen Weg zu verstehen, einen Benutzer zu handhaben, der eine Erlaubnis ändert, während meine APP noch im Hintergrund läuft.Zugriffsberechtigungen ändern, während in App

In meiner App habe ich eine Standortklasse, die sich für Standortänderungen registriert, und wenn sich der Standort ändert, wird der Status an einen Server gesendet. Dies läuft jedoch im Hintergrund.

Wenn meine App gestartet wird, erkundige ich mich bei dem Benutzer, ob es ok ist, Standortdienste zu verwenden, und wenn ja, fahre ich mit der Einrichtung dieser Klasse fort. Der Benutzer kann jedoch meine App im Hintergrund anzeigen und Einstellungen vornehmen und diese Berechtigung entfernen. Ich kann und werde sicher prüfen, ob die Berechtigung in meiner Standortklasse aktiviert ist, bevor ich vom Standortdienst nach einem Standort gefragt werde, um einen Absturz zu vermeiden. Ich bin jedoch nicht aktiv, wenn ein Standort eingeht. Daher weiß ich nicht, wie ich sie darauf hinweisen soll, dass meine App Standortdienste benötigt.

EDIT:

Es scheint, dass Android startet Ihre Anwendung, wenn eine Erlaubnis in Einstellungen aufgehoben. Allerdings habe ich bestätigt, dass ab sofort Android nicht Ihre App neu startet, wenn eine Erlaubnis über Einstellungen gewährt wurde.

+0

Konsultieren Sie dies. http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en – Isuru

+0

Nur wahr, wenn eine Genehmigung widerrufen wird, nicht gewährt. Siehe Bearbeiten. – lostintranslation

+2

_android startet Ihre App neu, wenn eine Berechtigung widerrufen wurde_ ... ist dieses Verhalten überall von Android dokumentiert? – Atul

Antwort

4

Ich habe irgendwo gelesen, dass Ihre App gelöscht wird, wenn der Benutzer die Berechtigungen für Android-M ändert. So können Sie sicher sein, dass sich dies während der Ausführung Ihrer App nicht ändert. Es wird getötet, wenn sich dies ändert.

Als Referenz-Check das Video: https://www.youtube.com/watch?v=f17qe9vZ8RM

+1

Das ist richtig. –

+4

Ich habe das auch gelesen. Tests zeigen jedoch, dass dies NICHT wahr ist. Wenn ich Einstellungen wähle, während meine App geöffnet ist, Berechtigungen ändere und Hintergrund-Apps betrachte, ist meine App immer noch da. Wenn ich auf die App aus der Liste der Hintergrund-Apps klicke, wird sie NICHT neu gestartet. – lostintranslation

+0

Können Sie bestätigen, dass Ihre App nicht neu gestartet wird? – rekire

1

Allerdings bin ich in einer Aktivität nicht, wenn eine Lage kommt, so bin ich nicht sicher, wie sie zu veranlassen, dass meine App Standortdienste benötigt.

Raise a Notification, alarmieren den Benutzer, dass Ihre App nicht bestimmungs Arbeit ohne Erlaubnis tun können, die sie widerrufen. Lassen Sie die Notification in eine Activity über eine PendingIntent binden, wo der Benutzer diese Erlaubnis erteilen kann.

+1

Wird nicht benötigt, wenn eine Berechtigung widerrufen wird, die App wird tatsächlich neu gestartet. Und es gibt keine Möglichkeit, auf eine Berechtigung zu warten, die in den Einstellungen gewährt wurde. Angenommen, Sie müssen nur in einer Aktivität, die für diese Berechtigung wichtig ist, onResume einchecken. – lostintranslation

+0

@lostintranslation: "Wird nicht benötigt, um eine Berechtigung zu widerrufen, die App wird tatsächlich neu gestartet" - ja, aber es kann nur mit dem Dienst neu gestartet werden, wenn Sie 'START_STICKY' oder' START_REDELIVER_INTENT' verwenden. Dann merkt Ihr Dienst, dass ihm die Berechtigung fehlt, und Sie müssen etwas tun, was ich in meiner Antwort vorgeschlagen habe. – CommonsWare

0

Zusammen mit CommonsWare Vorschlag, können Sie die onProviderDisabled() zu wissen, welcher Anbieter (GPS, Netzwerk) wurde deaktiviert und dementsprechend requestLocationUpdate() für die, die noch aktiviert ist. Wenn beide deaktiviert sind, prüfen Sie, ob mindestens der Zellenstandort für Ihre App nützlich ist. Wenn dies der Fall ist, können Sie den Zellenstandort mindestens so lange senden, bis der Benutzer die Benachrichtigung sieht und die Berechtigung erneut aktiviert. Verwenden Sie dazu PhoneStateListener.