到目前为止,这是我的代码:
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 ...任何想法?
答案 0 :(得分:278)
试试这个:
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());
}
答案 1 :(得分:39)
我刚刚发现:
new File("/sdcard/").listFiles()
如果您没有,则返回null:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在AndroidManifest.xml文件中设置。
答案 2 :(得分:10)
好的,AssetManager
列出了APK文件中assets
文件夹中的文件。所以你在上面的例子中列出的是[apk] / assets / sdcard / Pictures。
如果您将一些图片放在应用程序内的assets
文件夹中,并且它们位于Pictures
目录中,您将执行mgr.list("/Pictures/")
。
另一方面,如果您的APK文件之外的文件位于Pictures
文件夹中,那么您可以使用File
:
File file = new File(Environment.getExternalStorageDirectory(), "Pictures");
File[] pictures = file.listFiles();
...
for (...)
{
log.e("FILE:", pictures[i].getAbsolutePath());
}
来自文档的相关链接:
File
Asset Manager
答案 3 :(得分:9)
除上述所有答案外:
如果您使用的是Android 6.0+(API Level 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
答案 4 :(得分:2)
您的path
不在资源文件夹中。您可以通过AssetManager.list()
枚举assets文件夹中的文件,或者通过File.list()
答案 5 :(得分:1)
String[] listOfFiles = getActivity().getFilesDir().list();
或
String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list();
答案 6 :(得分: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());
}
}
}
答案 7 :(得分:1)
有两件事情可能发生:
READ_EXTERNAL_STORAGE
AndroidManifest.xml
权限
答案 8 :(得分:1)
我的minSdkversion是21,所以我正在使用ContextCompat.checkSelfPermission()
方法授予权限,同时在清单中添加了<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
。因此,尽管目标目录中有文件,但要摆脱NullPointerException,请按以下方式授予权限:-
public class MainActivity extends AppCompatActivity {
/*Other variables & constants here*/
private final int READ_EXTERNAL_STORAGE=100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ignore the button code
Button btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openWebView();
}
});
/*---------------------------- GRANT PERMISSIONS START-------------------------*/
// Main part to grant permission. Handle other cases of permission denied
// yourself.
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},READ_EXTERNAL_STORAGE);
/*---------------------------- GRANT PERMISSIONS OVER-------------------------*/
}
借助@Yury,列出所有文件的函数(在MainActivity.java中):-
public void getDownloadedFile() {
String path = Environment.getExternalStorageDirectory().toString()+"/Download/";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
if(directory.canRead() && files!=null) {
Log.d("Files", "Size: " + files.length);
for(File file: files)
Log.d("FILE",file.getName());
}
else
Log.d("Null?", "it is null");
}
答案 9 :(得分: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()));
}
}
答案 10 :(得分:0)
如果您使用的是Android 10 / Q,并且您已执行所有正确的操作来请求访问权限以读取外部存储,但仍然无法使用,则值得阅读以下答案:
Android Q (10) ask permission to get access all storage. Scoped storage
我有工作代码,但我的设备依靠网络连接(通常没有连接)自行更新。一旦在Android 10中,文件访问就不再起作用。无需重写代码即可解决此问题的唯一简便方法是,按照所述将额外的属性添加到清单中。现在,文件访问再次可以在Android 9中进行。 YMMV,在将来的版本中可能无法继续使用。
答案 11 :(得分:0)
Yury 的回答需要针对较新版本的 Android 进行一些详细说明。
首先,确保在清单文件中定义了READ_EXTERNAL_STORAGE权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
包括以下内容,对于大于或等于 Android 10(Q) 的 SDK。
<application android:requestLegacyExternalStorage="true"...</application>
现在您可以列出目录中的文件。
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());
}