2015-10-27 17 views
10

Ho utilizzato "Environment.getExternalStorage()" per archiviare e gestire i file. E non vi è alcun messaggio di avviso da logcat con tale metodo e funziona molto bene.Android: impossibile assicurare la directory

Ma, Il mio progetto ha bisogno di utilizzare il metodo "Context.getExternalFilesDir(String type)" E c'è un messaggio di avviso

ContextImpl: Impossibile garantire directory:/stoccaggio/Android/dati/(nome del pacchetto)/external_sd/file

Fortunatamente l'oggetto File funziona correttamente (anche leggere, scrivere o creare cartelle).

Ma voglio sapere come risolvere questo messaggio di avviso. Mi manca qualcosa?

+0

Leggi http: // mbcdev .com/2013/04/13/usando-androidi-esterno-storage-ef Fectively-and-judiciously/ –

+1

@IntelliJAmiya Grazie per la risposta rapida e modificare la mia risposta. L'ho controllato e ho scoperto che il riavvio è una soluzione, quindi riavvio il mio dispositivo di test, tuttavia, continua a mostrare lo stesso messaggio di avviso. Va bene ignorarlo? – iroiroys

risposta

0

Se si dispone di codice che sta iterando i file, chiamando questa API molte volte, questo avviso può causare inquinamento del registro. Per risolvere questo problema (poiché l'avviso è in realtà benigno) è possibile creare una classe wrapper che memorizzi il risultato della chiamata getExternalFilesDir/getExternalCacheDir e successivamente restituisca il valore memorizzato anziché chiamare l'API. In questo modo, almeno tu vedrai questo messaggio solo una volta.

4

Dovresti sapere come viene visualizzato il messaggio di avviso.

Il getExternalFilesDir(String type) chiamerà getExternalFilesDirs(String type) (notare la "s" alla fine del secondo nome del metodo).

Il getExternalFilesDirs(String type) troverà tutte le dirs del tipo e chiama ensureDirsExistOrFilter() alla fine per garantire che le directory esistano.

Se non è possibile raggiungere la dir, verrà stampato un avviso!

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

Quindi, se il dispositivo ha due percorsi di sdcard, produrrà due dir. Se uno non è disponibile, l'avviso verrà visualizzato.

La conclusione è che l'avviso non ha bisogno di essere risolto.

+0

Hai detto "Se non è possibile raggiungere la cartella, verrà stampato un avviso!", Ma i messaggi vengono visualizzati anche se vengono trovate le directory. come OP ha detto nella domanda. – ClassA

0

seguo il getExternalFilesDir() fonte

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


uso immediato Environment.getExternalStorageDirectory() ottiene ExternalDirs

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

}

Problemi correlati