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.
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.
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é
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();
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é.
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 .
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: