2015-07-15 5 views
13

Ich spiele mit der Preview M herum und teste meine App darauf, vor allem den "Speichern einer Datei auf externen Speicher" Teil. Bevor der Download/Prozess beginnt zu speichern, ich wünsche fürAndroid Preview M: Aktivität neu erstellt nach Erlaubnis gewähren

Manifest.permission.WRITE_EXTERNAL_STORAGE 

Erlaubnis als auf der Entwickler-Seite beschrieben: https://developer.android.com/preview/features/runtime-permissions.html

Der Dialog tritt wie erwartet:

"Allow <AppName> to access photos, media, and files on your device?" Deny/Allow 

Wenn ich den Hit " leught "-button, wird die onRequestPermissionsResult-Methode der Aktivität aufgerufen.

Wenn ich den "allow" -Button drücke, wird die Aktivität neu erstellt und anschließend die onRequestPermissionsResult-Methode aufgerufen. Ich denke, es ist ein Ergebnis der erteilten Erlaubnis.

Aber die zweite Situation ist schwierig, weil ich einen Rückruf auslösen soll, die den Download beginnt, aber das Objekt ist an dieser Stelle null:

public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 

    getLogger().error("onRequestPermissionsResult (" + requestCode + ", " + permissions + ", " + grantResults + ")"); 
    switch (requestCode) { 


     //permission for saving files? 
     case PermissionCode.WRITE_EXTERNAL_STORAGE: { 


      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       //HERE IS THE NULL-OBJECT 
       if (controller != null) { 

        controller.triggerCallback(); 
       } 
      } 
      break; 
     } 
     default: { 

      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 

Also meine Fragen sind:

  1. Can Ich vermeide diese Erholung?
  2. Wenn nein, wie kann ich meinen Code neu zu gestalten, das Problem zu lösen - ich bin total ideenlose im Moment

EDIT 1:

Ich habe versucht, das Problem mit einem Handler zu lösen und postDelayed - aber ich habe es übersprungen.

EDIT 2:

ich vorläufig gelöst es und zeigt einen Toast auf Benutzer mit der Bitte erneut den Download-Button drücken (bei erteilter Genehmigung). Aber Google: Bist du ernst?

EDIT 3:

Keine Erholung mit der neuesten SDK 6.0 (Version 23) passiert - vielleicht jemand mein Weinen in Mountain View gehört :-)

+0

Hey, wie hast du es schließlich? Ich kompiliere auch mit Version 23, und ich stehe immer noch vor Aktivitäten, die auf Erlaubnis neu starten und ablehnen. Die onRequestPermissionsResult-Methode wird nie aufgerufen. Ich rufe requestPermissions() von einem Fragment auf. Macht das einen Unterschied? –

+0

@Mayur Mehr: Wie widerrufst du/gewähre die Erlaubnis? Wenn ich innerliche App-Einstellungen annulliere/gewähre, habe ich nach der Wiederaufnahme der App noch eine Erholung. Aber innerhalb von App-Workflow - wie oben beschrieben - keine Erholung auftritt ... –

+0

vergesst, ich habe es gelöst. –

Antwort

1

Sie können jederzeit den Download-Zustand überprüfen unmittelbar nach Die Aktivität erstellt sich selbst in onCreate():

static final int MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; 
boolean initiateDownload = false; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(savedInstanceState != null) { 
     initiateDownload = savedInstanceState.getBoolean("toDownload"); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    final boolean hasPermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      == PackageManager.PERMISSION_GRANTED; 
    if(initiateDownload && hasPermission) { 
     // start download here... 
    } else { 
     requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE}, 
       MainActivity.MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == MY_PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE) { 
     if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      initiateDownload = true; 
     } else { 
      // denied permission... 
     } 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean("toDownload", initiateDownload); 
} 
+0

thx für Ihre Hilfe, aber sehe meine Bearbeitung! –

Verwandte Themen