J'essaie de sauvegarder mon fichier à l'emplacement suivantFileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
mais je reçois l'exception Java.io.FileNotFoundException
Cependant, quand je mets le chemin comme "/sdcard/"
cela fonctionne.
Maintenant, je suppose que je ne peux pas créer de répertoire automatiquement de cette façon.
Quelqu'un peut-il suggérer comment créer un directory and sub-directory
en utilisant un code?
Si vous créez un objet File qui enveloppe le répertoire de niveau supérieur, vous pouvez appeler sa méthode mkdirs () pour créer tous les répertoires nécessaires. Quelque chose comme:
// create a File object for the parent directory
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
// have the object build the directory structure, if needed.
wallpaperDirectory.mkdirs();
// create a File object for the output file
File outputFile = new File(wallpaperDirectory, filename);
// now attach the OutputStream to the file object, instead of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);
Remarque: Il peut être judicieux d'utiliser Environment.getExternalStorageDirectory () pour obtenir le répertoire "SD Card" car cela pourrait changer. si un téléphone contenant autre chose qu'une carte SD arrive (par exemple un flash intégré, un iPhone). Quoi qu'il en soit, gardez à l'esprit que vous devez vérifier que la carte SD est bien présente, car elle risque d'être retirée.
UPDATE: Depuis le niveau 4 de l'API (1.6), vous devez également demander l'autorisation. Quelque chose comme ceci (dans le manifeste) devrait fonctionner:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Avait le même problème et je veux juste ajouter que AndroidManifest.xml a également besoin de cette autorisation:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Voici ce qui fonctionne pour moi.
uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
dans votre manifeste et le code ci-dessous
public static boolean createDirIfNotExists(String path) {
boolean ret = true;
File file = new File(Environment.getExternalStorageDirectory(), path);
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
ret = false;
}
}
return ret;
}
En fait, j'ai utilisé une partie de @fiXedd answer et cela a fonctionné pour moi:
//Create Folder
File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images");
folder.mkdirs();
//Save the path as a string value
String extStorageDirectory = folder.toString();
//Create New file and name it Image2.PNG
File file = new File(extStorageDirectory, "Image2.PNG");
Assurez-vous que vous utilisez mkdirs () et non mkdir () pour créer le chemin complet.
À partir de l’API 8, l’emplacement de la carte SD a changé. La réponse de @ fiXedd est bonne, mais pour un code plus sûr, vous devez utiliser Environment.getExternalStorageState()
pour vérifier si le support est disponible. Ensuite, vous pouvez utiliser getExternalFilesDir()
pour accéder au répertoire souhaité (en supposant que vous utilisiez l'API 8 ou une version supérieure).
Vous pouvez en savoir plus dans le documentation du SDK .
Assurez-vous que le stockage externe est présent: http://developer.Android.com/guide/topics/data/data-storage.html#filesExternal
private boolean isExternalStoragePresent() {
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but
// all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) {
Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG)
.show();
}
return (mExternalStorageAvailable) && (mExternalStorageWriteable);
}
J'ai rencontré le même problème. Il existe deux types d'autorisations dans Android:
Voici la stratégie pour obtenir des autorisations dangereuses dans Android 6.0
onRequestPermissionsResult
Voici mon cas: j'ai besoin d'écrire sur un stockage externe.
Tout d'abord, je vérifie si j'ai l'autorisation:
...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
ActivityCompat.requestPermissions(parentActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
}
Puis vérifiez l'approbation de l'utilisateur:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case REQUEST_WRITE_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
//reload my activity with permission granted or use the features what required the permission
} else
{
Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
}
}
}
}
N'oubliez pas de vous assurer que vos noms de fichiers/dossiers ne contiennent aucun caractère spécial. M'est arrivé avec ":" lorsque je définissais les noms de dossiers à l'aide de variable (s)
caractères non autorisés dans les noms de fichiers/dossiers
"* /: <>?\|
Vous pouvez trouver ce code utile dans un tel cas.
Le code ci-dessous supprime tous les ":" et les remplace par "-"
//actualFileName = "qwerty:asdfg:zxcvb" say...
String[] tempFileNames;
String tempFileName ="";
String delimiter = ":";
tempFileNames = actualFileName.split(delimiter);
tempFileName = tempFileNames[0];
for (int j = 1; j < tempFileNames.length; j++){
tempFileName = tempFileName+" - "+tempFileNames[j];
}
File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/");
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
}
}
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();
cela créera un dossier nommé dor dans votre carte SD. puis chercher le fichier, par exemple, nomfichier.json, qui est inséré manuellement dans le dossier dor. Comme:
File file1 = new File(sdcard,"/dor/fitness.json");
.......
.....
<uses-permission Android: name = "Android.permission.WRITE_EXTERNAL_STORAGE" />
et n'oubliez pas d'ajouter du code dans manifest
Je faisais face au même problème, incapable de créer un répertoire sur Galaxy S mais j'ai réussi à le créer avec Nexus et Samsung Droid. Comment j'ai résolu le problème en ajoutant la ligne de code suivante:
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
//Create File object for Parent Directory
File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper");
if (!wallpaperDir.exists()) {
wallpaperDir.mkdir();
}
File out = new File(wallpaperDir, wallpaperfile);
FileOutputStream outputStream = new FileOutputStream(out);
Je viens de terminer le post de Vijay ...
manifeste
uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
Fonction
public static boolean createDirIfNotExists(String path) {
boolean ret = true;
File file = new File(Environment.getExternalStorageDirectory(), path);
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
ret = false;
}
}
return ret;
}
tilisation
createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir
createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt
Vous pouvez vérifier les erreurs
if(createDirIfNotExists("mydir/")){
//Directory Created Success
}
else{
//Error
}
Cela créera un dossier dans sdcard avec le nom de dossier que vous fournissez.
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
if (!file.exists()) {
file.mkdirs();
}
Vous pouvez utiliser/sdcard/à la place de Environment.getExternalStorageDirectory ()
private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/";
File dbdir = new File(DB_PATH);
dbdir.mkdirs();
ivmage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(
Intent.ACTION_PICK,
Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE_ADD);
}
});`