android - MediaStore.MediaColumns.DATA 已弃用并且 contentResolver.openAssetFileDescriptor(uri, "r") 花费大量时间。如何检查 Uri 是否存在?
问题描述
我曾经File.exsits()
检查File
路径是否由MediaStore.MediaColumns.DATA
存在提供。但现在(从 Android10 开始)MediaStore.MediaColumns.DATA
已被弃用。所以我用ContentResolver.openAssetFileDescriptor(uri, "r")
它来检查它是否存在。但ContentResolver.openAssetFileDescriptor(uri, "r")
花费更多时间。
以下代码片段显示了我现在如何检查它。但我不知道每次scoped external storage
都能正确获取的应用程序MediaStore.MediaColumns.DATA
和正确的返回值。File.exsits()
谁有更好的方法来解决这个问题?谢谢!
...
String path = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA));
Uri uri = ContentUris.withAppendedId(prefix, cursor.getLong(cursor.getColumnIndex(MediaStore.MediaColumns._ID)));
ContentResolver contentResolver = context.getContentResolver();
AssetFileDescriptor assetFileDescriptor = null;
try {
// Although path is deprecated, use path to check file exists first, because openAssetFileDescriptor cost long time
// I don't find other method.
if (TextUtils.isEmpty(path)) {
assetFileDescriptor = contentResolver.openAssetFileDescriptor(uri, "r");
if (assetFileDescriptor == null) {
return null;
}
} else {
File file = new File(path);
if (!file.exists()) {
path = null;
assetFileDescriptor = contentResolver.openAssetFileDescriptor(uri, "r");
if (assetFileDescriptor == null) {
return null;
}
}
}
}catch(Exception e){
return null
}finally{
FileUtil.closeSilently(assetFileDescriptor);
}
....
解决方案
推荐阅读
- spring - SpringBoot / Hibernate上模型关系的动态where子句
- javascript - 面对 main.js:1 Uncaught TypeError: (intermediate value).getUser 不是 HTMLInputElement 的函数。
- python - 从视图中的模型获取数据
- c++ - 在我的程序中使用 QT 对象时访问冲突
- ip - SagePay 是否有要在 VPN 中列入白名单的 IP 范围列表?
- vim - 当有三个窗口时交换两个窗口
- javascript - 如何创建一个方法来映射我的 JSON 对象以在 vue.js 中设置数据对象的属性?
- node.js - 如何从节点进程中获取容器 ID
- c++ - 为什么我不能使用 range-v3 反转拆分范围?
- android-camera - 如何使用 Google ARCore 在 AndroidStudio 中从相机位置获取屏幕作为数学平面和姿势?