我正在 android 27 模拟器上进行测试并尝试遍历一些目录。
当我尝试遍历/storage/emulated目录时,该方法会在存在时listFiles()返回。null/storage/emulated/0
这是一个测试代码:
File emuDir = new File("/storage/emulated");
File[] emuDirFiles = emuDir.listFiles(); // returns null.
File exStorageDir = new File("/storage/emulated/0")
exStorageDir.exists(); // returns true
Run Code Online (Sandbox Code Playgroud)
PS我已经在清单中添加了适当的存储权限并授予了运行时权限。
java android file-permissions android-6.0-marshmallow android-storage
尽管具有读写权限,但我无法在 Android 10 中访问 sdcard。这是我列出所有目录的方法。
File root = new File("/mnt/sdcard/");
File[] subFiles = root.listFiles();
for(File file : subFiles) {
if(file.isDirectory()) {
String str = text.getText().toString() + "\n";
str+=file.getAbsolutePath();
text.setText(str);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用/mnt/而不是/mnt/sdcard/我可以看到sdcard目录列在那里,但是当我使用时/mnt/sdcard/,subFiles是null. 我不知道这是关于新的 android 10 版本还是模拟器的问题。我正在使用 android studio 的默认模拟器进行调试。
所以我已经在这里坐了 4 个小时,我一直在挠头,为什么我的 2 个设备行为不端。问题是,即使授予了权限,checkSelfPermission 也会返回 false!我 100% 确定这不应该发生,因为它在 5-6 天前按预期工作。这是我用来检查是否授予权限的代码。
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v("BaseActivity", "Permission is granted");
return true;
} else {
Log.v("BaseActivity", "Storage Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return false;
}
} else { //permission is automatically granted on sdk<23 upon installation
Log.v("BaseActivity", "Permission is granted");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我第一次打开BaseActivity具有此代码的活动 ( ) 时,它都会按预期工作并请求用户获得存储权限。但是,在此活动中的片段中,我想在其中访问文件,每当我调用此方法时,它都开始返回 false。我已经公开了这个方法,它曾经根据情况返回真/假。这是我检查 Fragment 中是否授予权限的方法。
if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
Toast.makeText(getActivity(), …Run Code Online (Sandbox Code Playgroud) 关于WRITE_EXTERNAL_STORAGE,Android文档说明了这一点
从API级别19开始,读取/写入getExternalFilesDir(String)和getExternalCacheDir()返回的特定于应用程序的目录中的文件不需要此权限.
我的应用程序只读取和写入Android/data //文件目录.这是否意味着,为了在我的应用程序在早于19的Android版本上运行时读取和写入此特定目录,我仍然需要在清单中声明此权限?