Android KitKat 4.4 Ordner auf SD-Karte

Die neuen Berechtigungen für das Schreiben von Dateien auf SD-Karten (externer Speicher) auf Android 4.4 (EACCES-Berechtigung verweigert) haben uns soeben nicht verstanden.

Vor KitKat haben wir unseren beschreibbaren Ordner wie folgt festgelegt:

mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";

Nach stundenlangem Suchen bin ich jedoch zu Recht oder zu Unrecht zu dem Schluss gekommen, dass auf 4.4-Geräten, um das Schreiben von Dateien zu ermöglichen, Folgendes geändert werden muss:

mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";

Mfolder wäre also so etwas wie: /mnt/sdcard/Android/data/com.xyz.abc/appfiles

Ist dies korrekt? Erstellen wir einen Ordner wie den oben auf der SD-Karte angegebenen, damit 4.4-Geräte Dateien schreiben können?

mfolder ist ein String, den wir in gemeinsamen Einstellungen speichern.

Dann haben wir diesen Code, der einmal ausgeführt wird, wenn API> = 19, der den mfolder String ändert und dann alle Dateien aus dem alten Ordner in den neuen 'kitkat'-Ordner kopiert.

if (android.os.Build.VERSION.SDK_INT>=19){
        if (!mfolder.contains("/Android/data/com.xyz.abc/appfiles")){
            if (prefs.getBoolean("kitkatcheck", false)==false){

                //update mfolder from
                      // /mnt/sdcard/appfiles
                      // to
                      // /mnt/sdcard/Android/data/com.xyz.abc/appfiles
                String prekitkatfolder = mfolder;
                String kitkatfolder = mfolder.replace("/appfiles", "/Android/data/com.xyz.abc/appfiles");
                mfolder = kitkatfolder;
                try {
                    File sd = new File(mfolder);
                    if(!sd.exists() || !sd.isDirectory()) {
                        sd.mkdirs();
                    }
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), "Error creating Kitkat folder!\n" + e.toString(), Toast.LENGTH_LONG).show();
                    return;
                }
                prefEditor.putString("patternfolder", mfolder);
                prefEditor.putBoolean("kitkatcheck", true);
                prefEditor.commit();

                //copy files and folder from old appfiles folder to new.
                AllFiles.clear();
                listFilesAndFilesSubDirectories(prekitkatfolder);
                if (AllFiles.size()>0){
                    for (File child : AllFiles ) {
                        try {

                            File dest = new File(child.toString().replace(prekitkatfolder, kitkatfolder));


                            try {
                                String filePath = dest.getPath().substring(0, dest.getPath().lastIndexOf(File.separator));
                                File subfolder = new File(filePath);
                                if(!subfolder.exists() || !subfolder.isDirectory()) {
                                    subfolder.mkdirs();
                                }
                            } catch (Exception ex) {
                            }

                            copyFile(child, dest);  

                        } catch (Throwable t) {

                        }
                    }

                }


            }

        }

Ich benachrichtige dann den Benutzer, dass seine Dateien in den neuen Ordner kopiert wurden und dass er aufgrund der neuen Berechtigungen den alten Ordner prekitkatfolder manuell löschen müsste. Ich vermute, sie werden dies nur tun können, wenn sie einen Bestandsdateimanager haben oder wenn sie die SD-Karte ausgehängt und auf einem PC abgelegt haben, aufgrund der neuen 4.4-Berechtigungen.

Für uns scheint es auch so zu sein, dass diese 4.4-Berechtigungen nicht alle unsere Benutzer mit Kitkat betreffen. Einige können weiterhin in den ursprünglichen Ordner auf ihrem externen Speicher schreiben, andere erhalten den Fehler EACCES (Permission Denied). Kann jemand Aufschluss darüber geben, warum dies der Fall sein könnte? Man könnte annehmen, dass dies für alle 4.4-Geräte gilt, die externen Speicher verwenden.

Da wir kein aktuelles 4.4-Gerät haben, müssen wir diesen Code mit dem Emulator (API 19) testen, es wird jedoch nicht der Fehler "EACCES Permission Denied" angezeigt. Also haben wir eine Beta-Version mit dem obigen Code veröffentlicht und erfahren, dass die kopierten Dateien im internen Speicher landen. Wie kann das sein?

Irgendwelche Ideen, was wir falsch machen, danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage