Accesso alla memoria esterna nell'API Android 29

Sep 11 2020

Sto cercando di ottenere alcuni strumenti di pulizia. Sempre più produttori hanno vietato il rooting dei dispositivi per "motivi di sicurezza", è vietato NON richiederne lo sblocco.

Dopo l'API 28, questo codice farà errore:


ActivityCompat.requestPermissions(this, new String[]{
  Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1); // Request permission or not, Will got same result

File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null

Certo, posso usare questo:

android:requestLegacyExternalStorage="true"

Ma credo che in futuro verrà ucciso.

Quindi, un modo elegante per gestire SDCard?

Risposte

4 blackapps Sep 11 2020 at 07:10

Su Android 10 Environment.getExternalStorageDirectory()e Environment.getExternalStoragePublicDirectory()restituirà percorsi di archiviazione ma i percorsi non sono leggibili o scrivibili.

  1. Per Android 10 puoi continuare a utilizzare i percorsi forniti da Environment.getExternalStorageDirectory () e Environment.getExternalStoragePublicDirectory () se aggiungi android:requestLegacyExternalStorage="true"al tag dell'applicazione nel file manifest. In fase di esecuzione, l'app può chiamare Environment.isExternalStorageLegacy()per verificare se la richiesta è stata eseguita.

  2. Un'altra possibilità (non nota) (solo per Android 10) è quella di aggiungere <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />al file manifest. L'utente deve accedere alle impostazioni avanzate dell'app e abilitare da Advanced settings Install unknown apps | Allow from this source. La cosa bella è che l'utente può cambiare i diritti di accesso. Puoi renderlo più semplice per l'utente se implementi un intento per Settings.ACTION_APPLICATION_DETAILS_SETTINGScui può modificare le impostazioni. Una cosa divertente è che anche Environment.isExternalStorageLegacy () restituisce true.

  3. Compilando per Android 11 entrambe le opzioni non funzionano su un dispositivo Android 11. (Ma continuano a funzionare per i dispositivi Android 10). I percorsi di Environment.getExternalStorageDirectory () e Environment.getExternalStoragePublicDirectory () sono usable again in read mode and very often in write mode too. E questo è fantastico in quanto si può semplicemente elencare i contenuti di directory come Download o Immagini o DCIM / Fotocamera utilizzando nuovamente la classe File. Ma l'aggiunta <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />al file manifest e l'implementazione di un intento per Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONdaranno alla tua app l'accesso in lettura / scrittura per tutti i file anche sulla scheda micro sd rimovibile. (Finalmente puoi rimuovere il divieto di Google di non essere in grado di leggere / scrivere la tua scheda micro sd sul tuo dispositivo Android utilizzando la tua app). Environment.isExternalStorageManager()può essere utilizzato per verificare se l'autorizzazione è attivata / disattivata. Finché non provi a caricare la tua app nel Play Store, stai bene.