Verifica a livello di codice se in Android 10+ l'accesso alla memoria esterna legacy è disabilitato


12

Esiste una semplice chiamata API che mi direbbe se un'app in esecuzione su Android 10 o versioni successive deve utilizzare l'accesso alla memorizzazione con ambito, ovvero se il normale accesso ai file, noto anche come "Memoria esterna legacy" è disabilitato? Si noti che anche se l'app in AndroidManifest.xml, la sezione ha dichiarato:

  android:requestLegacyExternalStorage="true"

l'accesso al file potrebbe ancora essere negato a causa di modifiche delle norme di Google in futuro, quindi testare questo valore è inutile. L'unico modo che ho trovato è verificare se la directory principale di archiviazione esterna è leggibile, ma l'app deve prima richiedere l'autorizzazione di archiviazione, che è inutile per qualsiasi altra cosa, se l'archiviazione legacy è disabilitata.

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

Penso di aver visto una volta una nuova API per rilevarlo, ma non riesco più a trovare quell'articolo ...


an app running on Android 10 or later must use Scoped Storage access? Puoi spiegarci cosa intendi con quello? Quali funzioni hai in mente? So che ad esempio i volumi di archiviazione e il gestore archiviazione che sono stati portati per N sono già
obsoleti

Intendo un regolare accesso ai file Java oltre la sandbox assegnata all'app dal sistema, o ad es. In modalità CNI C ++ JNI fopen ("nomefile.ext", modalità); non funzionerà (accesso negato) se il percorso del file è oltre la directory dell'app assegnata dal sistema. Bene, funzionerà su Android 10 ora, se usi android: requestLegacyExternalStorage = "true" nel manifest, ma è una soluzione temporanea e potrebbe essere disabilitata completamente l'anno prossimo. Per saperne di più ad esempio androidcentral.com/what-scoped-storage-android-q
gregko

Anche in quell'articolo non è chiaro quale sarebbe l'archiviazione con ambito.
Blackapps

@blackapps, forse questo articolo lo spiega meglio: developer.android.com/training/data-storage/files/…
gregko

Ok. Accesso limitato alle sole directory private delle app.
Blackapps

Risposte:


8

È possibile utilizzare questi due metodi da android.os.Environment:

  • isExternalStorageLegacy(File path)

    Indica se il supporto di archiviazione condiviso / esterno nel percorso specificato è una vista legacy che include file non di proprietà dell'app.

  • isExternalStorageLegacy()

    Indica se il supporto di archiviazione principale condiviso / esterno è una vista legacy che include file non di proprietà dell'app.

Questo valore potrebbe essere diverso dal valore richiesto requestLegacyExternalStoragenel manifest dell'app, poiché un'app potrebbe ereditare il suo stato legacy in base alla prima installazione.

Le app non legacy possono continuare a scoprire e leggere i media appartenenti ad altre app tramite MediaStore.

Nel caso in cui scopri di avere accesso all'archiviazione legacy, personalmente penso che sia meglio migrare i dati sull'archiviazione con ambito e utilizzarli invece poiché l'archiviazione legacy potrebbe smettere di funzionare senza preavviso.


1
Grazie, @Zaffy, questa è esattamente la risposta che stavo cercando. Funziona perfettamente e non è necessario chiedere "Accesso allo spazio di archiviazione".
Gregko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.