Sie benötigen Callback
, wenn Benutzer WRITE_EXTERNAL_STORAGE
Erlaubnis von RuntimePermission dialog
zulassen.
Zuerst müssen Sie OnRequestPermissionsResultCallback
Listener
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.
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? –
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? –
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. –