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

0 ответов

Другие вопросы по тегам