J'ai essayé de créer un répertoire dans /sdcard
par programme, mais cela ne fonctionne pas. Le code ci-dessous renvoie toujours directory not created.
boolean success = (new File("/sdcard/map")).mkdir();
if (!success) {
Log.i("directory not created", "directory not created");
} else {
Log.i("directory created", "directory created");
}
Il y a trois choses à considérer ici:
Ne supposez pas que la carte SD est montée à /sdcard
_ (Peut être vrai dans le cas par défaut, mais il vaut mieux ne pas coder en dur.). Vous pouvez obtenir l'emplacement de sdcard en interrogeant le système:
Environment.getExternalStorageDirectory();
Vous devez informer Android que votre application doit écrire sur un stockage externe en ajoutant une entrée uses-permission dans le fichier AndroidManifest.xml:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
Si ce répertoire existe déjà, alors mkdir retournera false. Vérifiez donc l'existence du répertoire, puis essayez de le créer s'il n'existe pas. Dans votre composant, utilisez quelque chose comme:
File folder = new File(Environment.getExternalStorageDirectory() + "/map");
boolean success = true;
if (!folder.exists()) {
success = folder.mkdir();
}
if (success) {
// Do something on success
} else {
// Do something else on failure
}
J'ai eu le même problème après avoir mis à jour mon téléphone Android vers 6.0 (API de niveau 23). La solution suivante fonctionne pour moi. J'espère que cela vous aidera également.
Veuillez vérifier votre version de Android. Si c'est> = 6.0 (API niveau 23), vous devez non seulement inclure
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
dans votre AndroidManifest.xml, mais aussi demandez l'autorisation avant d'appeler mkdir () . Snopshot de code.
public static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
public int mkFolder(String folderName){ // make a folder under Environment.DIRECTORY_DCIM
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED.equals(state)){
Log.d("myAppName", "Error: external storage is unavailable");
return 0;
}
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
Log.d("myAppName", "Error: external storage is read only.");
return 0;
}
Log.d("myAppName", "External storage is not read only or unavailable");
if (ContextCompat.checkSelfPermission(this, // request permission when it is not granted.
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Log.d("myAppName", "permission:WRITE_EXTERNAL_STORAGE: NOT granted!");
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),folderName);
int result = 0;
if (folder.exists()) {
Log.d("myAppName","folder exist:"+folder.toString());
result = 2; // folder exist
}else{
try {
if (folder.mkdir()) {
Log.d("myAppName", "folder created:" + folder.toString());
result = 1; // folder created
} else {
Log.d("myAppName", "creat folder fails:" + folder.toString());
result = 0; // creat folder fails
}
}catch (Exception ecp){
ecp.printStackTrace();
}
}
return result;
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
Plus d'informations s'il vous plaît lire " Demander des autorisations au moment de l'exécution "
Le chemin correct vers la carte SD est
/mnt/sdcard/
mais, comme indiqué précédemment, vous ne devriez pas le coder en dur Si vous êtes sur Android 2.1 ou après, utilisez
getExternalFilesDir(String type)
Autrement:
Environment.getExternalStorageDirectory()
Lisez attentivement https://developer.Android.com/guide/topics/data/data-storage.html#filesExternal
En outre, vous devrez utiliser cette méthode ou quelque chose de similaire
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;
}
puis vérifiez si vous pouvez accéder à la carte SD. Comme dit, lisez la documentation officielle.
Une autre option, vous devrez peut-être utiliser mkdirs au lieu de mkdir
file.mkdirs()
Crée le répertoire nommé par le nom de fichier final de ce fichier, y compris le chemin de répertoire complet requis pour créer ce répertoire.
Redémarrer votre Android appareil. Les choses ont commencé à fonctionner pour moi après le redémarrage de l'appareil.
Si cela vous arrive avec Android 6 et que la cible est compilée> = 23, n'oubliez pas que nous utilisons maintenant autorisations d'exécution . Nous avons donc donné des autorisations dans le manifeste. n'est plus suffisant.
utilisez mkdirs () au lieu de mkdir () .. cela a fonctionné pour moi :)
File folder = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA");
if(!folder.exists()){
if(folder.mkdirs())
Toast.makeText(this, "New Folder Created", Toast.LENGTH_SHORT).show();
}
File sdCardFile = new File(Environment.getExternalStorageDirectory()+"/Saved CGPA/cgpa.html");
dans Android api> = 23
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
au lieu de
<app:uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
Avez-vous les autorisations nécessaires pour écrire sur la carte SD dans votre manifeste? Recherchez WRITE_EXTERNAL_STORAGE à l'adresse http://developer.Android.com/reference/Android/Manifest.permission.html
N'est-ce pas déjà créé? Mkdir renvoie false si le dossier existe déjà aussi mkdir
1. Si vous utilisez Android Bellow Marshmallow, vous devez définir des permésions dans le fichier manifeste. 2. Si vous utilisez une version ultérieure de Android signifie maintenant de Marshmallow à Oreo. Vous devez soit accéder aux informations de l'application et y définir manuellement l'autorisation de l'application pour le stockage. Si vous souhaitez le définir à l'exécution, vous pouvez le faire à l'aide du code ci-dessous.
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true;
} else {
Log.v(TAG,"Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else { //permission is automatically granted on sdk<23 upon installation
Log.v(TAG,"Permission is granted");
return true;
}
}
J'ai commis l'erreur d'inclure les deux:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
et:
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>
dans l'ordre ci-dessus. Alors, quand j'ai sorti la deuxième permission, (READ), le problème a disparu.
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/FoderName");
if (!f.exists()) {
f.mkdirs();
}