Ich hoffe, Sie können helfen. Ich kann nirgendwo eine Dokumentation finden. Ich ersuche um Laufzeitberechtigung in meiner Android App WRITE_EXTERNAL_STORAGE.Android N erlaubt Permission killt die App
Unter Android M funktioniert das wie erwartet. Ich drücke "Allow" und alles ist in Ordnung. Klicken Sie unter Android N auf "Zulassen", um meine App zu beenden. Es stürzt nicht ab, es hört einfach auf.
Im logcat zeigt es
Killing 6599:com.myname.myappname/u0a223 (adj 100): permission grant or revoke changed gids
Force removing ActivityRecord{c834991 u0 com.myname.myappname/.MainActivity t1814}: app died, no saved state
Destroying surface Surface(name=Window{bf01619 u0 com.myname.myappname/com.myname.myappname.MainActivity}) called by com.android.server.wm.WindowStateAnimator.destroySurface:-1 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:-1 com.android.server.wm.WindowState.removeLocked:-1 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:-1 com.android.server.wm.WindowManagerService.removeWindowLocked:-1 com.android.server.wm.WindowManagerService.removeWindowLocked:-1 com.android.server.wm.AppWindowToken.removeAllWindows:-1 com.android.server.wm.AppWindowToken.removeAppFromTaskLocked:-1
Mit Blick auf dem Android-Quellcode gefunden Erlaubnis Erteilung oder den Widerruf von geänderten gids 'in PackageManagerService.java
private static final String KILL_APP_REASON_GIDS_CHANGED = "permission grant or revoke changed gids";
Und
final int result = permissionsState.grantRuntimePermission(bp, userId);
switch (result) {
case PermissionsState.PERMISSION_OPERATION_FAILURE: {
return;
}
case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: {
mHandler.post(new Runnable() {
@Override
public void run() {
killSettingPackagesForUser(sb, userId, KILL_APP_REASON_GIDS_CHANGED);
}
});
Mein App-Code, der früher gut funktionierte, ist:
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
Und dann
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
if (requestCode == 1) {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do stuff
}
Kann jemand mir erklären, warum die App getötet wird? Und möglicherweise wie Sie es fangen, um die App programmgesteuert neu zu starten?
Für welche API-Ebene prüfen Sie? Unter 'API level 23' wird keine Laufzeitberechtigung verlangt. – Piyush
Meine Vermutung ist, dass dies ein Fehler in Ihrem Gerät ist. Während Ihr Prozess beendet wird, wenn der Benutzer Berechtigungen aus den Einstellungen widerruft, sollte er nicht beendet werden, wenn der Benutzer Berechtigungen erteilt, unabhängig davon, ob er in Ihrer App oder in den Einstellungen von requestPermissions() ausgelöst wurde. Sie könnten vorhandenen Code versuchen, der Laufzeitberechtigungen anfordert. Beispiel: [https://commonsware.com/Android] [mybooks] enthält keine Beispielanwendungen, die Laufzeitberechtigungen verwenden (z. B. [diese] (https://github.com/commonsguy/cw-omnibus/tree/). master/Permissions/tutorial/finish/RuntimePermTutorial)), zeigen Sie das von Ihnen beschriebene Verhalten. – CommonsWare
@ Piyush Korrekt. Dies geschieht, wenn Sie nach Laufzeitberechtigung auf API-Ebene 25 fragen. –