java - 如何在不使用管理外部存储权限的情况下在 android 11 范围存储中获取我的手机存储中可用的所有 pdf 文件
问题描述
我正在尝试这段代码。谁能告诉我如何才能在手机存储中仅获取 .pdf 文件?
protected ArrayList<String> getPdfList() {
ArrayList<String> pdfList = new ArrayList<>();
Uri collection;
final String[] projection = new String[]{
MediaStore.Files.FileColumns.DISPLAY_NAME,
MediaStore.Files.FileColumns.DATE_ADDED,
MediaStore.Files.FileColumns.DATA,
MediaStore.Files.FileColumns.MIME_TYPE,
};
final String sortOrder = MediaStore.Files.FileColumns.DATE_ADDED + " DESC";
final String selection = MediaStore.Files.FileColumns.MIME_TYPE + " = ?";
final String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
final String[] selectionArgs = new String[]{mimeType};
if (SDK_INT >= Build.VERSION_CODES.Q) {
collection = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
} else {
collection = MediaStore.Files.getContentUri("external");
}
try (Cursor cursor = getContentResolver().query(collection, projection, selection, selectionArgs, sortOrder)) {
assert cursor != null;
if (cursor.moveToFirst()) {
int columnData = cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA);
int columnName = cursor.getColumnIndex(MediaStore.Files.FileColumns.DISPLAY_NAME);
do {
if (new File(cursor.getString(columnData)).exists()) {
pdfList.add((cursor.getString(columnData)));
Log.d(TAG, "getPdf: " + cursor.getString(columnData));
//you can get your pdf files
}
} while (cursor.moveToNext());
}
}
return pdfList;
}
上面的代码在 requestLegacyExternalStorage = true 的情况下可以正常工作到 android 10 但在 android 11 cursor.moveToFirst() 得到 false
解决方案
将这两行添加到您的清单中:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
推荐阅读
- java - JUnit assertEquals 使用 HashSet 失败
- docker - 命名卷的 docker-compose.yml 语法
- parceljs - 包裹错误:无法读取 null 的属性“walk”
- c++ - SAL Annotations 会触发编译器报错吗?
- javascript - 使用按钮断开和重新连接 MutationObserver
- python-3.x - Pandas 中随时间推移的高效聚合索引
- python - 在 Pandas 中使用 Melt 函数
- go - 如何在 html/template 中计算一些东西
- git - 如何强制将分支合并到master?
- javascript - 为什么我的 this.setState 没有更新数组