quitar - Escribir almacenamiento externo no funciona hasta que reinicie la aplicación en Android M
permisos android studio (1)
Estoy teniendo un problema con el nuevo sistema de permisos. He modificado mi código para solicitar permiso para WRITE_EXTERNAL_STORAGE. Pero mi aplicación no puede escribir (o leer) en la tarjeta SD hasta que reinicie la aplicación (por supuesto, lo permití en el cuadro de diálogo). Después de eso está funcionando bien.
No es una aplicación nueva, ya declaré WRITE_EXTERNAL_STORAGE en el manifiesto, y en sistemas anteriores está funcionando bien.
Estoy usando los métodos checkSelfPermission y requestPermissions y cuando hago una solicitud de lectura o escritura a la tarjeta SD, tengo una excepción que no tengo permiso.
¿Alguien tiene alguna idea de lo que me perdí? O me encontré con un error?
La versión de SDK es la última (actualizada hace unas horas), y la estoy probando en el emulador.
Necesita Callback
cuando el Usuario permita el permiso RuntimePermission dialog
desde el RuntimePermission dialog
.
Primero debe implementar el OnRequestPermissionsResultCallback
Listener
OnRequestPermissionsResultCallback
de la clase ActivityCompat
en su Activity
y anular el void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
Método para verificar si el usuario está permitiendo o negando el permiso
Puedes hacer así:
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);
}
}
Aquí se onRequestPermissionsResult()
método onRequestPermissionsResult()
cuando el usuario permita o niegue el cuadro de diálogo Permiso desde el tiempo de ejecución.
También puede manejar la situación cuando el Usuario ha marcado nunca mostrar el cuadro de diálogo Permiso de tiempo de ejecución.
@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();
}
}
}
Aquí he usado Snackbar
para mostrar un mensaje relevante al usuario sobre Permiso y mainLayout
es la identificación del Activity''s Main Layout
de la Activity''s Main Layout
.
Espero que te ayude.