Nous avons une application qui utilise un stockage externe pour stocker certains fichiers temporaires: images, données binaires. Le code pour cela fonctionne depuis quelques années sans grands changements jusqu'à récemment. Sur Android Q cela ne fonctionne pas:
File f = new File(Environment.getExternalStorageDirectory().toString() + File.separator + MainActivity.APP_DIR)
f.mkdirs();
// do sth with f
mkdirs
retourne maintenant juste false
.
L'autorisation requise est fournie dans le manifeste:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Le code fonctionne bien sur les versions précédentes d'Android. Y a-t-il un changement au niveau du système pour ce type d'accès? Si oui, quelle est la solution de contournement?
Il y a eu un énorme changement de confidentialité dans Android Q en introduisant stockage étend .
Depuis Q beta 4, il est possible de opt-out de cette fonctionnalité en:
requestLegacyExternalStorage
l'attribut manifeste:<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android Q. -->
<application Android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
* notez que je ne l'ai pas testé, je ne fais que citer des documents
Dans l'API niveau 29, l'accès direct aux périphériques de stockage partagés/externes est obsolète. Lorsqu'une application cible Build.VERSION_CODES.Q
, Le chemin renvoyé par la méthode getExternalStorageDirectory()
n'est plus directement accessible aux applications. Les applications peuvent continuer à accéder au contenu stocké sur un stockage partagé/externe en migrant vers des alternatives telles que Context # getExternalFilesDir (String) , MediaStore , ou Intent # ACTION_OPEN_DOCUMENT .
Il est recommandé d'utiliser le stockage limité, à moins que votre application n'ait besoin d'accéder à un fichier qui ne réside pas dans le répertoire spécifique à l'application.
Ceux qui sont confrontés au problème de gestion des fichiers dans Android-Q peuvent lire l'article this pour en savoir plus.