mkdir () funktioniert zwar im internen Flash-Speicher, aber nicht auf der SD-Karte?

Ich erstelle gerade eine Dateiverwaltungs-App, mit der der Benutzer das Dateisystem seines Geräts durchsuchen kann. Der Benutzer startet im Stammverzeichnis/ie können jedoch zu einem beliebigen Speicherort navigieren, z. B. zum internen Flash-Speicher oder zur SD-Kart

Eine der kritischen Anforderungen dieser App besteht darin, dem Benutzer das Erstellen neuer Ordner an einem beliebigen Ort zu ermöglichen. Eine solche Funktion wäre für die App immens nützlich. DasFile#mkdir() -Methode funktioniert überhaupt nicht im SD-Kartenverzeichnis.

Ich habe der Manifestdatei die entsprechenden Berechtigungen hinzugefügt. Ich habe auch einen Test geschrieben, um festzustellen, in welchen Verzeichnissen (die alle auf meinem Lollipop 5.0-Gerät vorhanden sind) ein neuer Ordner erstellt werden kann. Aus meinen Beobachtungen,File#mkdir() funktioniert nur im internen Flash-Speicher.

Hinweis bitte nicht verwechselnEnvironment#getExternalStorageDirectory() mit dem Speicherort der SD-Karte, wie unter @ erläuteDieser Artike. Auch auf Lollipop 5.0 glaube ich/storage/emulated/0/ und/storage/sdcard0/ Beziehen Sie sich auf den internen Flash-Speicher, während/storage/emulated/1/ und/storage/sdcard1/ beziehen Sie sich auf die SD-Karte (was zumindest für das Gerät gilt, mit dem ich teste).

Wie kann ich auf nicht gerooteten Android-Geräten neue Dateien und Ordner in Bereichen außerhalb des externen Speicherpfads erstellen?

Manifest

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

Prüfung

...
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String NEW_FOLDER_NAME = "TestFolder";
        testPath(new File(Environment.getExternalStorageDirectory(), NEW_FOLDER_NAME));
        testPath(new File("/storage/emulated/0/", NEW_FOLDER_NAME));
        testPath(new File("/storage/emulated/1/", NEW_FOLDER_NAME));
        testPath(new File("/storage/sdcard0/Download/", NEW_FOLDER_NAME));
        testPath(new File("/storage/sdcard1/Pictures/", NEW_FOLDER_NAME));
    }

    private void testPath(File path) {
        String TAG = "Debug.MainActivity.java";
        String FOLDER_CREATION_SUCCESS = " mkdir() success: ";

        boolean success = path.mkdir();
        Log.d(TAG, path.getAbsolutePath() + FOLDER_CREATION_SUCCESS + success);
        path.delete();
    }
}

Ausgabe

/storage/emulated/0/TestFolder mkdir() success: true
/storage/emulated/0/TestFolder mkdir() success: true
/storage/emulated/1/TestFolder mkdir() success: false
/storage/sdcard0/Download/TestFolder mkdir() success: true
/storage/sdcard1/Pictures/TestFolder mkdir() success: false

Antworten auf die Frage(8)

Ihre Antwort auf die Frage