Как получить список файлов в каталоге в Android? - PullRequest
0 голосов
/ 26 июня 2019

Я хочу перечислить все изображения в каталоге, чтобы сделать галерею. Пример ниже работает с Intent для получения пути к каталогу.

Я пробовал метод listFiles(), но он возвращает ноль.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Permision Request
    ActivityCompat.requestPermissions(MainActivity.this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            1);
    initialize();
}

//For the Intent to get Folder
private void initialize() {
    Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    startActivityForResult(Intent.createChooser(i, "Choose directory"), 9999);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case 9999:
            //File myFile = new File(data.getData().toString());
            String path = data.getData().toString();
            //View the path
            Log.i("Test", "Result URI " + path);
            Toast.makeText(getApplicationContext(), "Result URI " +data.getData().toString(), Toast.LENGTH_LONG).show();

            //Creating new File for the directory
            File directory = new File(path);
            File[] files = directory.listFiles();

            Log.d("Files", "Size: "+ files.length);
            for (int i = 0; i < files.length; i++)
            {
                //Show the name of the files in the directory
                Log.d("Files", "FileName:" + files[i].getName());
            }

            break;
    }
}

в манифесте у меня также есть разрешение на чтение из внешнего хранилища

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

Ожидается, что вернет имя файла в каталоге, но вместо этого вернет эту ошибку:

Caused by: java.lang.NullPointerException: Attempt to get the length of null array
    at cu.edu.cujae.citi.folderpicker.MainActivity.workWithFile(MainActivity.java:59)
    at cu.edu.cujae.citi.folderpicker.MainActivity.onActivityResult(MainActivity.java:49)
    at android.app.Activity.dispatchActivityResult(Activity.java:6932)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132) 
    at android.app.ActivityThread.-wrap20(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

1 Ответ

0 голосов
/ 26 июня 2019

Пример ниже работает с Intent для получения пути к каталогу.

Нет, он использует ACTION_OPEN_DOCUMENT_TREE для получения дерева документов.Это может представлять или не представлять каталог в файловой системе.

Самый простой способ работы с Uri, возвращаемым ACTION_OPEN_DOCUMENT_TREE, - это использовать DocumentFile.fromTreeUri().Затем вы можете вызвать listFiles(), чтобы получить DocumentFile объекты, указывающие на документы (и поддеревья) в этом дереве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...