首页 > 解决方案 > 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);
        }
        ....

标签: androidandroid-10.0scoped-storage

解决方案


推荐阅读