Как просмотреть файлы в каталоге Android?
Здесь мой код:
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... любые идеи?
Спасибо!
Ответы
Ответ 1
Попробуйте следующее:
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());
}
Ответ 2
Я только что обнаружил, что:
new File("/sdcard/").listFiles()
возвращает null, если у вас его нет:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
установленный в вашем файле AndroidManifest.xml.
Ответ 3
Ну, AssetManager
перечисляет файлы в папке assets
, находящейся внутри вашего файла APK. Итак, что вы пытаетесь перечислить в приведенном выше примере, это [apk]/assets/sdcard/Pictures.
Если вы поместили несколько изображений внутри папки assets
внутри вашего приложения и находились в каталоге Pictures
, вы сделали бы mgr.list("/Pictures/")
.
С другой стороны, если у вас есть файлы на SD-карте, находящейся за пределами вашего файла APK, в папке Pictures
, вы должны использовать File
так:
File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}
И соответствующие ссылки из документов:
File
Asset Manager
Ответ 4
В дополнение ко всем приведенным выше ответам:
Если вы находитесь на 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
Ответ 5
Ваш path
не находится в папке с ресурсами. Либо вы перечисляете файлы в папке с ресурсами с помощью AssetManager.list()
, либо перечисляете файлы на SD-карте с помощью File.list()
Ответ 6
String[] listOfFiles = getActivity().getFilesDir().list();
или
String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
Ответ 7
Есть две вещи, которые могут произойти:
- Вы не добавляете
READ_EXTERNAL_STORAGE
разрешение на AndroidManifest.xml
- Вы ориентируетесь на Android 23, и вы не запрашиваете это разрешение для пользователя. Спуститесь на Android 22 или попросите пользователя получить это разрешение.
Ответ 8
Попробуйте следующее:
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());
}
}
}