La mia app scrive (e legge) i file di cache nella posizione getExternalCacheDir(). Prima di Android Lollipop (API 21) Sto usando questa autorizzazione con successo:Perché ho bisogno dell'autorizzazione WRITE_EXTERNAL_STORAGE con getExternalCacheDir() su Android Lollipop?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
Il maxSdkVersion è lì perché questa autorizzazione non dovrebbe essere necessario dopo l'API v18: http://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE
Ma su Android Lollipop (5.0) ricevo un permesso di accesso in questo modo (con la mia uscita di log per mostrare il percorso effettivo utilizzato):
11-19 13:01:59.257 4462-4541/com.murrayc.galaxyzoo.app E/android-galaxyzoo﹕ createCacheFile(): IOException for filename=/storage/emulated/0/Android/data/com.murrayc.galaxyzoo.app/cache/52
java.io.IOException: open failed: EACCES (Permission denied)
at java.io.File.createNewFile(File.java:941)
at com.murrayc.galaxyzoo.app.provider.ItemsContentProvider.createCacheFile(ItemsContentProvider.java:528)
vedo questo sia nell'emulatore e sul mio Nexus 4. qualcosa è cambiato, o Stavo facendo qualcosa di negativo g tutto insieme? Voglio solo accedere alla cache della mia app.
Aggiornamento: Ora lo vedo solo sul mio dispositivo (Nexus 4 con Android 5.1.1 standard, che ha avuto anche un nuovo reflash Android da quando ho avuto questo problema per la prima volta). Non vedo più questo nell'emulatore - ovviamente le immagini di sistema sono state aggiornate più volte.
Se non aggiungere questo androide: maxSdkVersion = proprietà "18", allora funziona? –
Sì. Devo sempre richiedere WRITE_EXTERNAL_STORAGE per farlo funzionare. Mi chiedo se c'è un modo per dire che è necessario per <18 but > 20, se è davvero necessario per 21 (Lollipop). – murrayc
Sì come da documentazione A partire dal livello API 19, questa autorizzazione non è richiesta per leggere/scrivere file nelle directory specifiche dell'applicazione restituite da getExternalFilesDir (String) e getExternalCacheDir() in modo da non richiedere questa autorizzazione 19 o API, ma la conclusione è non funziona senza questa autorizzazione. –