Я использовал 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);
}
....