androidディレクトリ内のファイルを一覧表示する方法は?


120

これまでの私のコードは次のとおりです。

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";

        AssetManager mgr = getAssets();

        try {

            String list[] = mgr.list(path);
            Log.e("FILES", String.valueOf(list.length));

            if (list != null)
                for (int i=0; i<list.length; ++i)
                    {
                        Log.e("FILE:", path +"/"+ list[i]);
                    }

        } catch (IOException e) {
            Log.v("List error:", "can't list" + path);
        }

それでも私はそのディレクトリにファイルを持っていますが、それは私にlist.length = 0を返します...何かアイデア?

回答:


328

ファイルにアクセスするには、マニフェストファイルで権限を付与する必要があります。

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

これを試して:

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
Log.d("Files", "Size: "+ files.length);
for (int i = 0; i < files.length; i++)
{
    Log.d("Files", "FileName:" + files[i].getName());
}

7
Yuryに感謝します。奇妙なことに、file.lengthがNullPointerExceptionを出します... スパシボ!
Roger Travis

8
指定されたフォルダにファイルがないと思います。file []のnullを確認してください。nullの場合、結果は得られず、file.lengthによって例外が発生します。
Yury、

4
"/"が欠けていたようです:)ありがとう!
Roger Travis

1
チャームのように働いた!私の携帯はMoto G4、Android Nです。誰かが直面してcan't play video errorいる場合。あなたはあなたの携帯電話に行く必要がありますsettings --> apps --> your app --> permissions --> enable storage. このエラーに直面している場合はこれを手動で行う必要があります <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />マニフェストにあることを確認してください。直面している人々のためにNullPointerException-あなたはアプリの内部ストレージにあるファイルにアクセスしようとしています。
coderpc 2017年

fileList()。clear();のようなものはありますか?、この方法を再利用できるように
user55924 2018年

44

私はちょうどそれを発見しました:

new File("/sdcard/").listFiles() ない場合はnullを返します。

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

AndroidManifest.xmlファイルに設定します。


6
これは真実だと知っていますが...これは答えですか?またはコメントにする必要がありますか?
Joaquin Iurchuk

7
さらに、Android 6.0以降では、[設定]-> [アプリ]-> [アプリ]-> [権限]で権限を付与する必要があります。
vt。

1
ディレクトリが空の場合もnullを返します
Hitesh Sahu

11

まあ、APKファイルAssetManager内のassetsフォルダー内のファイルを一覧表示します。したがって、上記の例でリストしようとしているのは[apk] / assets / sdcard / Picturesです。

assetsアプリケーション内のフォルダー内にいくつかの画像を配置し、それらがPicturesディレクトリにある場合は、そうしますmgr.list("/Pictures/")

一方、sdcard上のAPKファイルの外部にあるファイルがPicturesフォルダー内にある場合は、次のように使用Fileします。

File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}

そして、ドキュメントからの関連リンク:
File
Asset Manager


「File [] pictures = file.listFiles();」を試してみましたが、NullPointExceptionも発生しました... hmm ...
Roger Travis

1
"/"が欠けていたようです:)ありがとう!
Roger Travis

1
私の日を保存してくれてありがとう:)
Syed Nazar Muhammad

@SyedNazarMuhammadハ そして、私の友人を救ってくれてありがとう。常に前向きな発言をお楽しみください:D
Reed

11

上記のすべての回答に加えて:

Android 6.0以降(APIレベル23以降)を使用している場合は、外部ストレージへのアクセス許可を明示的に要求する必要があります。単に持っている

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

あなたのマニフェストでは十分ではありません。また、アクティビティで許可を積極的に要求しています。

//check for permission
if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){
    //ask for permission
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_PERMISSION_CODE);
}

これを読むことをお勧めします:http : //developer.android.com/training/permissions/requesting.html#perm-request



1
String[] listOfFiles = getActivity().getFilesDir().list();

または

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();

1

これを試して:

public class GetAllFilesInDirectory {

public static void main(String[] args) throws IOException {

    File dir = new File("dir");

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories");
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for (File file : files) {
        System.out.println("file: " + file.getCanonicalPath());
    }

}

}

1

発生する可能性があるのは2つあります。

  • READ_EXTERNAL_STORAGE権限を追加していませんAndroidManifest.xml
  • あなたはAndroid 23をターゲットとしていて、ユーザーにその許可を求めていません。Android 22に移動するか、ユーザーにその許可を求めます。

0

これらをお試しください

 String appDirectoryName = getResources().getString(R.string.app_name);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getResources().getString(R.string.app_name));
    directory.mkdirs();
    File[] fList = directory.listFiles();
    int a = 1;
    for (int x = 0; x < fList.length; x++) {

        //txt.setText("You Have Capture " + String.valueOf(a) + " Photos");
        a++;
    }
    //get all the files from a directory
    for (File file : fList) {
        if (file.isFile()) {
            list.add(new ModelClass(file.getName(), file.getAbsolutePath()));
        }
    }

0

Android 10 / Qを使用していて、外部ストレージを読み取るためのアクセス許可を要求するために正しいことをすべて実行しても、それが機能しない場合は、この回答を読む価値があります。

Android Q(10)は、すべてのストレージにアクセスする許可を求めます。スコープ付きストレージ

動作するコードはありましたが、ネットワーク接続時(通常は接続なしでした)にデバイスがそれ自体を更新しました。Android10に入ると、ファイルアクセスは機能しなくなりました。コードを書き直さずに修正する唯一の簡単な方法は、説明したようにその追加属性をマニフェストに追加することでした。ファイルアクセスがAndroid 9と同様に機能するようになりました。YMMV、それはおそらく将来のバージョンでは機能しなくなるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.