问题背景:
我想扫描系统中所有的txt文件,但是该有txt文件夹中,显示文件数为空
手动扫描的方法
/**
*
* 手动扫描方法
*
* @param dirPath
* @return
*/
private List<File> getFiles(String dirPath) {
List<File> fileList = new ArrayList<>();
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
LogUtils.INSTANCE.d("getFiles file: " + file);
if (file.isDirectory()) {
// 如果是目录,则递归扫描
fileList.addAll(getFiles(file.getAbsolutePath()));
} else {
// 如果是文件,则添加到列表中
fileList.add(file);
}
}
}
return fileList;
}
//方法调用
//文件系统挂起
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//扫描特定文件
//getFiles("/storage/emulated/0/jlc-oa-phone-helper/logs");
// 扫描系统所有文件
getFiles(Environment.getExternalStorageDirectory().getAbsolutePath());
}
问题原因:
android 11后访问和读取外部文件时,需要添加MANAGE_EXTERANAL_STORGE权限,并且跳转特定界面去申请该权限。
解决办法
<!-- 读取文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- android 11访问和读写外部文件时,需要添加该权限,并且跳转特定界面开启该权限-->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
动态申请”所有文件访问权限“
/**
* 访问文件读写外部文件权限,需要去特定界面申请
*
* @param activity 界面
*/
public static void requestFilePermission(Activity activity) {
LogUtils.INSTANCE.e("requestPermission Build.VERSION.SDK_INT: " +Build.VERSION.SDK_INT);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse(String.format("package:%s", activity.getPackageName())));
activity.startActivityForResult(intent, Activity.RESULT_CANCELED);
}
} catch (Exception e) {
LogUtils.INSTANCE.e("requestPermission Exception: " + e.getMessage());
}
}
实际效果
问题解决展示
创造价值,乐哉分享!
776147358