2015-10-27 11 views
10

ファイルの保存と管理に「Environment.getExternalStorage()」を使用しています。そしてその方法ではlogcatからの警告メッセージはなく、非常にうまく動作します。Android:ディレクトリの確保に失敗しました

しかし、私のプロジェクトは "Context.getExternalFilesDir(String type)" メソッドを使用する必要があると警告メッセージ

ContextImplがあります:ディレクトリを確保するために失敗しました:/ストレージ/ external_SD /アンドロイド/データ/(パッケージ名)/ファイル

は、

Fileオブジェクトはうまく動作します(読み込みや書き込み、フォルダの作成など)。

しかし、その警告メッセージを解決する方法を知りたいと思います。私は何かが恋しいですか?

+0

読むのHTTP GET従ってください:// mbcdevを.com/2013/04/13/using-androids-external-storage-ef fectively-and-obviousiciously/ –

+1

@IntelliJAmiyaすぐに返信して、私の答えを編集してくれてありがとう。チェックしたところ、再起動が解決策であることがわかったので、テストデバイスを再起動しましたが、同じ警告メッセージが表示されます。それを無視しても大丈夫ですか? – iroiroys

答えて

0

このAPIを何回も呼び出すファイルを反復処理するコードがある場合、この警告はログの汚染を引き起こす可能性があります。これを解決するには(警告は実際には問題ないので)、getExternalFilesDir/getExternalCacheDirを呼び出した結果を格納し、その後APIを呼び出す代わりに格納された値を返すラッパークラスを作成できます。このようにして、少なくともあなたはこのメッセージを一度しか見ることができません。

4

警告メッセージの表示方法を知っておく必要があります。

getExternalFilesDir(String type)は、getExternalFilesDirs(String type)(2番目のメソッド名の最後に「s」が付いています)を呼び出します。

getExternalFilesDirs(String type)は、タイプのすべてのディレクトリを検出し、最後にensureDirsExistOrFilter()を呼び出してディレクトリが存在することを確認します。

ディレクトリに到達できない場合、警告が表示されます。

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

お使いのデバイスに2つのSDカードのパスを持っているのであれば、それは2つのdirsを生成します。使用できない場合は、警告が表示されます。

結論は修正する必要はありません。

+0

ディレクトリに到達できない場合は警告が表示されますが、ディレクトリが見つかった場合でもメッセージが表示されます。 OPのように質問に言った。 – ClassA

0

私はgetExternalFilesDir()ソース

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


すぐに使用Environment.getExternalStorageDirectoryは()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; 
} 

}

関連する問題