riguarda il nuovo modello di runtime permissions introduced in Android Marshmallow quando si richiede l'autorizzazione Manifest.permission.WRITE_EXTERNAL_STORAGE
.Richiedere e autorizzare il permesso WRITE_EXTERNAL_STORAGE in fase di runtime non ha alcun effetto sulla sessione corrente
In breve, quello che sto vivendo è che se chiedo (e l'utente lo consente) Manifest.permission.WRITE_EXTERNAL_STORAGE
il permesso, l'applicazione non sarà in grado di leggere e scrivere dalla directory di archiviazione esterna fino distruggo e riavviare l'applicazione .
Questo è quello che sto facendo/sperimentando:
mia app parte da uno stato in cui:
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
Questo è, non ho i permessi per accedere a storage esterno.
Poi, chiedo il permesso di Manifest.permission.WRITE_EXTERNAL_STORAGE proprio come Google spiega
private void requestWriteExternalStoragePermission() {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(this)
.setTitle("Inform and request")
.setMessage("You need to enable permissions, bla bla bla")
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(MendeleyActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_PERMISSION_WRITE_EXTERNAL_STORAGE);
}
})
.show();
} else {
ActivityCompat.requestPermissions(MendeleyActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_PERMISSION_WRITE_EXTERNAL_STORAGE);
}
}
Una volta che l'utente consente il permesso, onRequestPermissionsResult
viene invocata.
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case RC_PERMISSION_WRITE_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && PackageManager.PERMISSION_GRANTED
// allowed
} else {
// denied
}
break;
}
}
}
Il allowed
blocco viene eseguito, confermando che l'utente ha concesso i permessi.
Immediatamente dopo questo, se non distruggo e apro di nuovo l'app, non ho ancora nessun permesso di accesso all'archiviazione esterna. Più in particolare:
hasWriteExternalStoragePermission(); // returns true
Environment.getExternalStorageDirectory().canRead(); // RETURNS FALSE!!
Environment.getExternalStorageDirectory().canWrite(); // RETURNS FALSE!!
Così, sembra che il tempo di esecuzione Android pensa che ho i permessi, ma il file system non ... Infatti, nel tentativo di accedere Environment.getExternalStorageDirectory()
genera l'eccezione:
android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:438)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
Se ora distruggo l'app e la apri di nuovo, il comportamento diventa come dovrebbe, potendo leggere e scrivere nella cartella di archiviazione esterna.
Qualcuno sta vivendo questo?
Sto usando emulatore un funzionario con:
- più recenti di Android 6.0 (API 23) API 23, Rev 1.
- emulatore in esecuzione Intel x86 Atom immagine del sistema, API 23, Rev 1.
ho costruire l'applicazione con:
android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 16
targetSdkVersion 23
}
...
}
Se qualcuno lo conferma e io non sono l'unico su e immagino che avremo bisogno di aprire un bug, ma spero di fare qualcosa di sbagliato, poiché penso che una tale caratteristica di base sia improbabile che possa contenere errori nell'SDK.
"Qualcuno sta vivendo questo?" - Non lo sono, ma non l'ho provato su un emulatore. Ho usato l'hardware. – CommonsWare
Quindi è probabile che sia solo sull'emulatore ... Aggiornerò una volta ricevuto l'aggiornamento di Android M. – GaRRaPeTa
https://code.google.com/p/android-developer-preview/issues/detail?id=2982 – greywolf82