0

Wie kann ich für Android-Geräte mit API 23 oder höher externe Speicherberechtigungen erteilen, ohne die App neu zu starten (so wie die Musikbibliothek des Benutzers in einer Sitzung in Google Play Music hochgeladen wird)? ? Ich weiß, dass dieses Thema hier in SO mehrmals angesprochen wurde, aber bisher habe ich kein Glück gefunden.Erteilen von Berechtigungen für externen Speicher ohne Neustart der App

Hier sind die Berechtigungen in meinem Manifest-Datei:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    /** 
    * CODE HERE FOR INSTANTIATIONS AND SUCH. 
    */ 
} 

... Denn ab jetzt, ich die App neu zu starten bräuchten für die Berechtigungen zu gehen durch (und MainActivity Instanziierungen und solche) nach die Berechtigungen aus dem ersten Pop-up-Fenster akzeptieren.

Vielen Dank.

+2

"Ich müsste die App für die Berechtigungen neu starten" - nein, Sie nicht. Bewegen Sie "CODE HIER FÜR INSTANTIATIONS UND SOLCHE." in eine andere Methode. Rufen Sie diese Methode von 'onCreate()' auf, wenn Sie zu diesem Zeitpunkt bereits über Berechtigungen verfügen. Rufen Sie diese Methode auch von 'onRequestPermissionsResult()' auf, wenn der Benutzer diesen Berechtigungen zugestimmt hat. Sehen Sie [dieses Beispielprojekt] (https://github.com/commonsguy/cw-omnibus/tree/master/Files/FilesEditor) zum Beispiel. – CommonsWare

Antwort

1

Als @CommonsWare vorgeschlagen, können Sie alle Ihre Code setzen, die instantiations tut UND SOLCHE bei einem Verfahren wie instantiateMyObjects() und rufen in der onCreate() wie

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE); 
      // Define the constant MY_PERMISSION_CODE. 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    instantiateMyObjects(); 
} 

Und wenn Benutzer akzeptiert/verweigert Ihre Anfrage Erlaubnis onRequestPermissionsResult() heißt. Vergessen Sie nicht zu definieren MY_PERMISSION_CODE nehmen Sie es als 1 zum Beispiel.

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

    if (requestCode == MY_PERMISSION_CODE) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Now you can instantiate your objects. 
      instantiateMyObjects(); 
     } else { 
      // User denied it. 
     } 
    } 
} 
Verwandte Themen