it-swarm.com.de

Das Erstellen eines Verzeichnisses in / sdcard schlägt fehl

Ich habe versucht, programmgesteuert ein Verzeichnis in /sdcard Zu erstellen, aber es funktioniert nicht. Der folgende Code gibt immer directory not created. Aus

boolean success = (new File("/sdcard/map")).mkdir(); 
if (!success) {
    Log.i("directory not created", "directory not created");
} else {
    Log.i("directory created", "directory created");
}
55
sajjoo

Hier sind drei Dinge zu beachten:

  1. Gehen Sie nicht davon aus, dass die SD-Karte mit /sdcard Gemountet ist. Sie können den Speicherort der SD-Karte abrufen, indem Sie das System abfragen:

    Environment.getExternalStorageDirectory();
    
  2. Sie müssen Android) darüber informieren, dass Ihre Anwendung auf einen externen Speicher schreiben muss, indem Sie einen Verwendungsberechtigungseintrag in die AndroidManifest.xml -Datei einfügen:

    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  3. Wenn dieses Verzeichnis bereits existiert, gibt mkdir false zurück. Überprüfen Sie daher, ob das Verzeichnis vorhanden ist, und erstellen Sie es, falls es nicht vorhanden ist. Verwenden Sie in Ihrer Komponente Folgendes:

    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 
    }
    
150
Gopinath

Ich hatte das gleiche Problem, nachdem ich mein Android auf 6.0 aktualisiert habe (API-Stufe 23). Die folgende Lösung funktioniert bei mir. Hoffentlich hilft es Ihnen auch.

Bitte überprüfen Sie Ihre Android Version. Wenn es> = 6.0 ist (API-Level 23), müssen Sie nicht nur einschließen

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

fordern Sie in Ihrer AndroidManifest.xml aber auch die Berechtigung an, bevor Sie mkdir () aufrufen. Code-Schnappschuss.

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
    }
}

Weitere Informationen finden Sie unter " Anfordern von Berechtigungen zur Laufzeit ".

26
Diiiiii

Der richtige Pfad zur SD-Karte lautet

/mnt/sdcard/

aber wie bereits beantwortet, sollten Sie es nicht hart codieren. Wenn Sie mit Android 2.1 oder neuer arbeiten, verwenden Sie

getExternalFilesDir(String type) 

Andernfalls:

Environment.getExternalStorageDirectory()

Bitte sorgfältig lesen https://developer.Android.com/guide/topics/data/data-storage.html#filesExternal

Außerdem müssen Sie diese oder eine ähnliche Methode verwenden

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;
}

überprüfen Sie dann, ob Sie auf die SD-Karte zugreifen können. Wie gesagt, lies die offizielle Dokumentation.

Eine andere Option, möglicherweise müssen Sie mkdirs anstelle von mkdir verwenden

file.mkdirs()

Erstellt das Verzeichnis mit dem nachstehenden Dateinamen dieser Datei, einschließlich des vollständigen Verzeichnispfads, der zum Erstellen dieses Verzeichnisses erforderlich ist.

16
Maragues

Neustart Ihr Android Gerät. Nach dem Neustart des Geräts hat die Arbeit für mich begonnen.

15
Uriel Frankel

Wenn Ihnen dies mit Android 6 und Kompilierungsziel> = 23 passiert, vergessen Sie nicht, dass wir jetzt Laufzeitberechtigungen verwenden. Geben Sie also Berechtigungen im Manifest ist nicht mehr genug.

7
Kuno

benutze mkdirs () anstelle von mkdir () .. es hat bei mir funktioniert :)

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");
6
Bala Vishnu

in Android api> = 23

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

anstatt

    <app:uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
2
Vahe Gharibyan

Haben Sie die richtigen Berechtigungen, um in Ihrem Manifest auf die SD-Karte zu schreiben? Suchen Sie nach WRITE_EXTERNAL_STORAGE unter http://developer.Android.com/reference/Android/Manifest.permission.html

1
Matthieu

Ist es nicht schon geschaffen? Mkdir gibt false zurück, wenn der Ordner bereits vorhanden ist mkdir

1
fedj

Es gibt viele Dinge, über die Sie sich Sorgen machen müssen 1.Wenn Sie Android Bellow Marshmallow verwenden, müssen Sie Permesionen in der Manifest-Datei festlegen. 2. Wenn Sie eine neuere Version von Android verwenden, bedeutet dies, dass Sie jetzt von Marshmallow zu Oreo wechseln. Entweder müssen Sie die App-Info aufrufen und dort die App-Berechtigung für die Speicherung manuell festlegen. Wenn Sie es zur Laufzeit einstellen möchten, können Sie dies mit dem folgenden Code tun

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;
}

}

1
Nadeem Bhat

Ich habe den Fehler gemacht, beides einzuschließen:

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

und:

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

in der obigen Reihenfolge. Als ich die zweite Erlaubnis (READ) herausnahm, verschwand das Problem.

0
user2638345
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
        + "/FoderName");
if (!f.exists()) {
    f.mkdirs();
}
0
ashvin sapariya