16

Ich habe ein Problem mit dem neuen Berechtigungssystem. Ich habe meinen Code geändert, um die Berechtigung für WRITE_EXTERNAL_STORAGE zu erhalten. Aber meine App kann nicht auf die SD-Karte schreiben (oder lesen), bis ich die Anwendung neu starte (natürlich habe ich es im Dialog erlaubt). Danach funktioniert es gut.Das Schreiben von externem Speicher funktioniert erst, wenn ich die Anwendung unter Android neu starte. M

Es ist keine neue App, ich habe WRITE_EXTERNAL_STORAGE bereits im Manifest deklariert, und auf früheren Systemen funktioniert es gut.

Ich benutze checkSelfPermission und requestPermissions Methoden und wenn ich eine Lese- oder Schreibanfrage an die SD-Karte mache, habe ich eine Ausnahme, dass ich keine Erlaubnis habe.

Jeder hat eine Idee was habe ich vermisst? Oder bin ich auf einen Käfer gestoßen?

SDK-Version ist die neueste (vor ein paar Stunden aktualisiert), und ich teste es auf dem Emulator.

+0

Nur um zu verdeutlichen: sagen Sie, dass Sie Code hinzugefügt haben, um Berechtigungen zum Lesen/Schreiben von externem Speicher anzufordern, wenn Sie die Erlaubnis genehmigt haben, aber nicht erlaubt, die App neu zu starten, und das war, wenn Sie das Problem bemerkt? –

+0

Ja, ich habe den Code hinzugefügt, um die Erlaubnis anzufordern, der Dialog tauchte auf, ich habe es zugelassen, aber ich habe immer noch eine Ausnahme beim Lesen/Schreiben, bis ich die Anwendung neu starte. Danach funktioniert es gut, kann den Speicher lesen und schreiben. Und das passiert jedes Mal, wenn ich die Berechtigung in den Einstellungen widerrufen, in der App wieder zulassen, und es funktioniert nicht bis zum Neustart. Ich weiß nicht, was dieses Problem verursachen kann, ist es von Entwurf oder habe ich ein Problem mit dem SDK? –

+1

Für diese Art von Berechtigung sollte die App automatisch neu formatiert werden. Diese Berechtigungen führen dazu, dass Ihre App in spezielle (Linux-Kernel-verstandene) Gruppen und SE-Linux-Kontexte verschoben wird. Damit der Prozess Ihrer App tatsächlich den richtigen GID- und SE-Kontext aufweist, muss dieser nach der notwendigen Konfigurationsänderung neu gestartet werden. Dies ist einer der Fälle, in denen der App-Neustart erforderlich ist, aber das Framework sollte dies für Sie gewaltsam tun. –

Antwort

4

Sie benötigen Callback, wenn Benutzer WRITE_EXTERNAL_STORAGE Erlaubnis von RuntimePermission dialog zulassen.

Zuerst müssen Sie OnRequestPermissionsResultCallbackListener von ActivityCompat Klasse in Ihrer Activity implementieren und void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) Methode außer Kraft setzen zu prüfen, ob Benutzer ist erlaubt oder verweigert die Erlaubnis

Sie mögen dies tun können:

int REQUEST_STORAGE = 1; 

private void checkExternalStoragePermissions() { 
    if (hasStoragePermissionGranted()) { 
     //You can do what whatever you want to do as permission is granted 
    } else { 
     requestExternalStoragePermission(); 
    } 
} 

public boolean hasStoragePermissionGranted(){ 
     return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; 
} 

public void requestExternalStoragePermission() { 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
     ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       REQUEST_STORAGE); 
    } 
} 

Hier onRequestPermissionsResult() Die Methode wird aufgerufen, wenn Benutzer das Erlaubnis-aus-Runtime-Erlaubnisdialogfeld zulassen oder verweigern.

Sie können auch Situationen behandeln, in denen der Benutzer das Dialogfeld "Laufzeitberechtigungen" aktiviert hat.

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

     if (requestCode == REQUEST_STORAGE) { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //User allow from permission dialog 
       //You can do what whatever you want to do as permission is granted 
      } else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       //User has deny from permission dialog 
       Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),Snackbar.LENGTH_INDEFINITE) 
         .setAction("OK", new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE); 
          } 
         }) 
         .show(); 
      } else { 
       // User has deny permission and checked never show permission dialog so you can redirect to Application settings page 
       Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),Snackbar.LENGTH_INDEFINITE) 
        .setAction("OK", new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
           Intent intent = new Intent();     intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
           Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null); 
           intent.setData(uri); 
           startActivity(intent); 
          } 
         }) 
         .show(); 
      } 
     } 
} 

Hier habe ich Snackbar verwendet um Erlaubnis zum Benutzer relevante Nachricht zu zeigen und mainLayout ist id von Activity's Main Layout.

Ich hoffe, es hilft Ihnen.