web-dev-qa-db-fra.com

Essayer de créer un fichier sous Android: échec de l'ouverture: EROFS (système de fichiers en lecture seule)

Cette ligne:

final FileOutputStream outputStream = new FileOutputStream(name);

résulte en une FileNotFoundException avec le message /2ozjfFQzwv: open failed: EROFS (Read-only file system) où "2ozjfFQzwv" est ce que j'ai transmis comme nom du fichier.

J'ai essayé ceci avec et sans l'autorisation WRITE_INTERNAL_STORAGE. Comment créer ce fichier pour l'écriture?

Alternativement, je veux juste pouvoir donner une image à une nouvelle activité, et c'est trop gros pour la sérialiser dans un extra. Existe-t-il un moyen plus simple que de l'écrire dans un fichier puis de le relire? Toutes les questions ici semblent concerner l’écriture sur une carte SD, ce que je ne veux pas faire parce que beaucoup de gens n’ont pas de logement pour carte SD.

41
Drew

J'ai essayé ceci avec et sans l'autorisation WRITE_INTERNAL_STORAGE.

Il n'y a pas d'autorisation WRITE_INTERNAL_STORAGE dans Android.

Comment créer ce fichier pour l'écriture?

Vous ne le faites pas, sauf peut-être sur un appareil root, si votre application s'exécute avec les privilèges de superutilisateur. Vous essayez d'écrire à la racine du stockage interne, auquel les applications n'ont pas accès.

Veuillez utiliser la version du constructeur FileOutputStream qui utilise un objet File. Créez cet objet File à partir d'un emplacement dans lequel vous pouvez écrire, tel que:

  • getFilesDir() (appelé sur votre Activity ou autre Context)
  • getExternalFilesDir() (appelé sur votre Activity ou autre Context)

Ce dernier nécessitera WRITE_EXTERNAL_STORAGE comme permission.

Existe-t-il un moyen plus simple que de l'écrire dans un fichier puis de le relire?

Vous pouvez le placer temporairement dans un membre de données statique.

parce que beaucoup de gens n'ont pas de fentes pour cartes SD

Les "fentes pour cartes SD" sont sans importance dans l’ensemble. 99% des utilisateurs d'appareils Android auront un stockage externe, à l'exception des appareils de plus de 4 ans où l'utilisateur a retiré leur carte SD. Les périphériques fabriqués depuis la mi-2010 disposent d'un stockage externe intégré au flash intégré, et non d'un support amovible.

78
CommonsWare

essayez d'utiliser l'autorisation de WRITE_EXTERNAL_STORAGEVous devez l'utiliser, qu'il y ait une carte externe ou non.

Cela fonctionne bien pour moi:

path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);

et place mes fichiers dans le dossier approprié

14
Martin

Voici un exemple simple de développeur Android .

Fondamentalement, vous pouvez écrire un fichier dans la mémoire interne comme ceci:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
5
Xuan Wu

Ajouter 

 <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

dans manifest et en utilisant le même que Martin:

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname);

Ça a marché.

5
nobjta_9x_tq

Comme d'autres l'ont mentionné, une application sur Android ne peut pas écrire un fichier dans un dossier de la mémoire de stockage interne, mais dans son propre stockage privé (sous/data/data/PACKAGE_NAME).

Vous devez utiliser l'API pour obtenir le chemin correct autorisé pour votre application.

lisez ceci .

2
android developer

Google a limité l'accès en écriture à la carte SD externe. De l'API 19, il existe une structure appelée Storage Access Framework qui vous permet de définir des "contrats" pour autoriser l'accès en écriture.

Pour plus d'infos:

Android - Comment utiliser le nouveau Storage Access Framework pour copier des fichiers sur une carte SD externe

0
Theo