我曾经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);
}
....