MediaStore.MediaColumns.DATA устарела, а contentResolver.openAssetFileDescriptor (uri, "r") стоит много времени. Как я могу проверить, что Uri существует? - PullRequest
0 голосов
/ 18 октября 2019

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