用例:
在这里,我可以使用 MediaStore 在本地存储中创建和保存文件,并从 MediaStore 获取所有文件。但是,一旦我清除存储或重新安装应用程序,由同一应用程序自行创建的文件将不再可用。重新安装应用程序后,我们是否需要权限才能读取自创建的文件?
如果我们需要许可,如何请求许可并从 Android-Q 的“下载”文件夹中获取所有 PDF 文件。
public static ArrayList<FileModel> getExternalPDFFileList(Context context) {
ArrayList<FileModel> uriList = new ArrayList<>();
try {
ContentResolver cr = context.getContentResolver();
String[] projection = {MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DISPLAY_NAME};
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE;
String[] selectionArgs = null;
String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
String[] selectionArgsPdf = new String[]{mimeType};
String sortOrder = android.provider.MediaStore.Files.FileColumns.DATE_TAKEN + " DESC";
Cursor cursor = cr.query(extUri, projection, selectionMimeType, selectionArgsPdf, sortOrder + " DESC");
assert cursor != null;
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
int columnIndex = cursor.getColumnIndex(projection[0]);
long fileId = cursor.getLong(columnIndex);
Uri fileUri = Uri.parse(extUri.toString() + "/" + fileId);
String displayName = cursor.getString(cursor.getColumnIndex(projection[1]));
uriList.add(new FileModel(displayName, fileUri));
}
cursor.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return uriList;
}
注意:在android Q之前,只要开启权限,我们就可以获取外部存储的所有文件。但在 Android SDK-28 之后,出现了完全不同的文件系统。由于缺乏适当的文档,很难完成小任务。
重新安装应用程序后,我们是否需要权限才能读取自创建的文件?
问错问题了。
如果您卸载应用程序然后重新安装它,它将被视为不同的应用程序。
因此,您的应用程序无法“查看”媒体存储中由卸载的应用程序创建的文件。
由于没有权限,你什么也做不了。
是的,就权限而言,通过清除存储授予的每种权限也被“清除”。
卸载后您是否检查过文件是否确实被删除?我最好的猜测是,如果它们保存在内部存储中,那就是
我在 MediaStore Framework 文件系统读写权限方面遇到了类似的问题。 我的应用程序创建的文件夹和文件在卸载应用程序后仍保留在设备中。但应用程序重新安装后,它无法识别之前创建的同一文件夹;不确定,但可能与媒体存储缓存文件夹标识符被清除或什么有关?无法弄清楚 MediaStore 的行为方式。
如果我删除该文件夹并尝试从我的应用程序创建,它工作正常。
另一个问题,我一直在使用 Media Store 进行文件创建和更新创建的文件,它在一段时间内工作正常,但一段时间后 MediaStore 框架文件系统无法识别、替换或更新相同的文件,从而导致创建重复文件新数据具有相同的文件名。
例如:首先Test.txt更新或替换为具有相同文件名的新数据。但随着时间的推移,它无法替换并创建重复的 Test.txt (1)、Test.txt (2) 等等...我的应用程序无法处理,因为我的应用程序仅查找“Test.txt”文件。
要正常解决问题:我必须删除所有 Test.txt、Test.txt (1), .... 并尝试使用新数据创建 Test.txt。
由于最近 Android 文件系统的更改,它仅在 android sdk-R 及更新版本之后发生。
如果有解决方案可以为用户跳过这些删除步骤,请感谢您的解决方案。
谢谢你。