web-dev-qa-db-fra.com

Android Q: file.mkdirs () renvoie false

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?

10
khusrav

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:

  • ciblage api 28 (ou inférieur)
  • en utilisant 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

24
Pawel

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.

5
Anoop M