web-dev-qa-db-ja.com

ファイルは存在し、ISディレクトリですが、listFiles()はnullを返します

File.listFiles()のドキュメント は、nullを呼び出すファイルがディレクトリではない場合にのみ返されることを示唆しています。

私は次のものを持っています:

String dir = "/storage/emulated/0";
File f = new File(dir);
Log.v("Files",f.exists()+"");
Log.v("Files",f.isDirectory()+"");
Log.v("Files",f.listFiles()+"");

ログは次のとおりです。

true
true
null

何らかの理由で、 listFiles()は、nullが有効なディレクトリとして認識されているにもかかわらず、Fileを返しています。 Androidファイル階層の振る舞いにあまり慣れていないので、問題はそこにあると思います。

参考までに、Moto Xでデバッグを行っていますが、電話がコンピューターに接続されているかどうかにかかわらず、結果は同じです。したがって、接続されたときにマウントする必要はないと思います。

60
Wilson

この問題がある場合は、これをAndroidManifest.xmlに追加します。

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

問題解決:D

編集:これが機能しない場合は、パスが正しいかどうかを確認してください

84
BamsBamx

Android バージョン23以降の場合、次のようにonresumeメソッドでプログラムで実行時許可を与える必要があります。

public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};

public final int EXTERNAL_REQUEST = 138;

requestForPermission();

public boolean requestForPermission() {

    boolean isPermissionOn = true;
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        if (!canAccessExternalSd()) {
            isPermissionOn = false;
            requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST);
        }
    }

    return isPermissionOn;
}

public boolean canAccessExternalSd() {
    return (hasPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
}

private boolean hasPermission(String perm) {
    return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));

}
17

この問題が発生した場合、読み取り許可を付与するには、これをAndroidManifest.xmlに追加します。

Android:name="Android.permission.READ_EXTERNAL_STORAGE" 

また、あなたも許可を与える必要があります

設定>アプリ> "アプリ名">権限>ストレージ

11
Ravi Joshi

File 'listFiles'メソッドのドキュメントから:この抽象パス名がディレクトリを示していない場合、またはI/Oエラーが発生した場合はnullを返します。

そのため、おそらくI/Oエラーが発生しました。そのディレクトリの権限を確認してください。Javaプログラムを実行しているユーザーは、そのディレクトリを読み取る権限を持っていますか?そうでない場合は、答えがあります。

ところで、何かを文字列に変換するために+ ""を使用するべきではありません。String.valueOfよりも遅いため、悪い習慣です。 ApacheのStringUtilsを使用してその配列を文字列に結合しますが、そのためには、jarをクラスパスに追加する必要があります。

8
msknapp

マニフェストに許可を追加するだけでuses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"とあなたの問題は解決されます。

2
kamal

私の問題は、何らかの理由でAndroid:sharedUserId = "Android.uid.system"属性がアプリに特定のデバイスで/ sdcard /の読み取りを許可していないことでした。

簡単なテストだけを行う必要があるため、sharedUserId属性を削除し、テストしてから追加し直しました。

1
thiagolr

<uses-permission .... >セクションのマニフェストファイルで、この行Android:name="Android.permission.READ_EXTERNAL_STORAGE"を追加します。これで問題が解決するかもしれません。

0
Rajan Menon

Javaで同じ問題がありましたが、Androidではなく、引用符で囲まれたパスで設定ファイルを読み取ります。引用符を削除するだけで問題を解決しました。

したがって、文字列の置換関数でそれを行うか、引用符なしでそれを与えることができます

文字列someString = "C:\ path"; someString = someString.replace( "\" "、" ");

0
Sam