it-swarm.com.de

Android: Verzeichnis konnte nicht gesichert werden

Ich habe "Environment.getExternalStorage()" zum Speichern und Verwalten von Dateien verwendet. Es gibt keine Warnmeldung von logcat mit dieser Methode und funktioniert sehr gut.

Mein Projekt muss jedoch die Methode "Context.getExternalFilesDir(String type)" verwenden, und es wird eine Warnmeldung angezeigt

ContextImpl: Fehler beim Sicherstellen des Verzeichnisses:/storage/external_SD/Android/data/(Paketname)/files

Glücklicherweise funktioniert das File-Objekt einwandfrei (Lesen oder Schreiben oder Erstellen von Ordnerfunktionen). 

Ich möchte jedoch wissen, wie diese Warnmeldung behoben werden kann. Vermisse ich etwas

14
iroiroys

Sie sollten wissen, wie die Warnmeldung angezeigt wird.

Die getExternalFilesDir(String type) ruft getExternalFilesDirs(String type) auf (beachten Sie das 's' am Ende des zweiten Methodennamens).

getExternalFilesDirs(String type) findet alle Verzeichnisse des Typs und ruft am Ende ensureDirsExistOrFilter() auf, um sicherzustellen, dass die Verzeichnisse vorhanden sind.

Wenn das Verzeichnis nicht erreicht werden kann, wird eine Warnung ausgegeben!

Log.w(TAG, "Failed to ensure directory: " + dir);
dir = null;

Wenn Ihr Gerät also über zwei SD-Kartenpfade verfügt, werden zwei Verzeichnisse erzeugt. Wenn einer nicht verfügbar ist, wird die Warnung angezeigt.

Die Schlussfolgerung ist, dass die Warnung nicht behoben werden muss.

9
Hongji Song

Wenn Sie Code haben, der Dateien durchläuft, die diese API mehrmals aufrufen, kann diese Warnung zu Protokollverschmutzungen führen. Um dieses Problem zu lösen (da die Warnung tatsächlich gutartig ist), können Sie eine Wrapper-Klasse erstellen, die das Ergebnis des Aufrufs von getExternalFilesDir/getExternalCacheDir speichert und anschließend den gespeicherten Wert zurückgibt, anstatt die API aufzurufen. Auf diese Weise werden Sie diese Nachricht immer nur einmal sehen.

1
Mr. Bungle

Ich folge der getExternalFilesDir () - Quelle

/**
 * Ensure that given directories exist, trying to create them if missing. If
 * unable to create, they are filtered by replacing with {@code null}.
 */
private File[] ensureExternalDirsExistOrFilter(File[] dirs) {
    File[] result = new File[dirs.length];
    for (int i = 0; i < dirs.length; i++) {
        File dir = dirs[i];
        if (!dir.exists()) {
            if (!dir.mkdirs()) {
                // recheck existence in case of cross-process race
                if (!dir.exists()) {
                    // Failing to mkdir() may be okay, since we might not have
                    // enough permissions; ask vold to create on our behalf.
                    final IMountService mount = IMountService.Stub.asInterface(
                            ServiceManager.getService("mount"));
                    try {
                        final int res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
                        if (res != 0) {
                            Log.w(TAG, "Failed to ensure " + dir + ": " + res);
                            dir = null;
                        }
                    } catch (Exception e) {
                        Log.w(TAG, "Failed to ensure " + dir + ": " + e);
                        dir = null;
                    }
                }
            }
        }
        result[i] = dir;
    }
    return result;
}


sofortige Verwendung Environment.getExternalStorageDirectory () ExternalDirs abrufen

public final class StorageUtil {

public static final String DIR_Android = "Android";
private static final String DIR_DATA = "data";
private static final String DIR_FILES = "files";
private static final String DIR_CACHE = "cache";

@Nullable
public static synchronized File getExternalStorageAppFilesFile(Context context, String fileName) {
    if (context == null) return null;
    if (fileName == null) return null;
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        File dirs = buildExternalStorageAppFilesDirs(Environment.getExternalStorageDirectory().getAbsolutePath(), context.getPackageName());
        return new File(dirs, fileName);
    }
    return null;
}


public synchronized static File buildExternalStorageAppFilesDirs(String externalStoragePath, String packageName) {
    return buildPath(externalStoragePath, DIR_Android, DIR_DATA, packageName, DIR_FILES);
}


public synchronized static File buildPath(String base, String... segments) {
    File cur = new File(base);
    for (String segment : segments) {
        cur = new File(cur, segment);
    }
    return cur;
}

}

0
任非凡