Ich arbeite an einem Programm zur Organisation von Mediendateien für Android, und ich möchte Mediendateien in eine Verzeichnisstruktur wie Root/Artist/Album/Song.flac verschieben. Ich gehe in einer Schleife durch eine Datenstruktur, die diese Informationen enthält, und erstelle mit mkdirs() Verzeichnisse. Wenn ich die erstellten Ordner durchsuche (mit OI File Manager oder File Expert), kann ich das Verzeichnis der ersten Ebene betreten und die Namen der Verzeichnisse der zweiten Ebene sehen, aber sie werden als 0-Byte-Dateien angezeigt. Zuerst dachte ich, es seien wirklich nur Dateien und versuchte es erneut, aber wenn ich sie in der ADB durchsuche, sind es Dateien. Die Berechtigungen sind das Problem:
Ich habe zum Beispiel meinen Root unter /mnt/storage/FLAC:
ls -l
drwxrw-rw- 4 app_63 app_63 16 Dec 3 20:42 Artist_1
drwxrw-rw- 3 app_63 app_63 16 Dec 3 20:42 Artist_2
...
Die Verzeichnisse der zweiten Ebene (/mnt/storage/FLAC/Artist_1 usw.) haben die gleichen Berechtigungen wie die Album-Ordner.
Wenn ich die Berechtigungen manuell mit chmod bearbeite und beide Ordner auf drwxrwxrwx (777) setze, kann ich in die Ordner navigieren und die Dateien im Dateimanager abspielen. Dies kann mit chmod +x geschehen.
Hier ist der Code, den ich verwende:
public void organizeFiles(String rootDir, ArrayList<libraryElementArtist> libraryData)
{
for(int i = 0; i < libraryData.size(); i++)
{
//create artist folder
//{
// (new File(rootDir + File.separator + libraryData.get(i).name)).mkdirs();
//}
for(int j = 0; j < libraryData.get(i).albums.size(); j++)
{
//create album folder
(new File(rootDir + File.separator + libraryData.get(i).name + File.separator + libraryData.get(i).albums.get(j).name + File.separator)).mkdirs();
for(int k = 0; k < libraryData.get(i).albums.get(j).songs.size(); k++)
{
//move song into folder
FileOperations.moveFile(libraryData.get(i).albums.get(j).songs.get(k).filename, rootDir + "/" + libraryData.get(i).name + "/" + libraryData.get(i).albums.get(j).name);
}
}
}
}
Dies ist die Funktion moveFile:
public static boolean moveFile(String sourcefile, String dest)
{
File file = new File(sourcefile);
File dir = new File(dest);
return file.renameTo(new File(dir, file.getName()));
}
Ich habe diese Zeile in meiner Manifest-Datei:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Der Speicher ist 16GB intern ext3 auf meinem Gerät. Wie sollte ich diese Berechtigungskorrektur zu meinem Code hinzufügen?