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