ContentResolver:column ‘_data‘ does not exist. Available columns: [document_id, mime_type,

    private  void getContentResolverInfo(Uri uri, int width, int height, SlideFactory.MediaType mediaType) {
        Cursor cursor = null;
        long   start  = System.currentTimeMillis();

        try {
            cursor = context.getContentResolver().query(uri, null, null, null, null);

            if (cursor != null && cursor.moveToFirst()) {
                String fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
                long   fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE));
                long   filePath = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) );

                String mimeType = context.getContentResolver().getType(uri);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null)
                cursor.close();
        }
    }
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err: java.lang.IllegalArgumentException: column '_data' does not exist. Available columns: [document_id, mime_type, _display_name, summary, last_modified, flags, _size]
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:351)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:91)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at org.thoughtcrime.securesms.wallet.ui.WalletImportActivity.getContentResolverInfo(WalletImportActivity.java:234)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at org.thoughtcrime.securesms.wallet.ui.WalletImportActivity.onActivityResult(WalletImportActivity.java:214)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:8310)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:5008)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:5056)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.os.Looper.loop(Looper.java:223)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7656)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
2021-05-25 12:49:05.292 17563-17563/org.securesms W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

一般使用这个时都是从系统读取资源后希望根据MediaStore.Files.FileColumns.DATA字段获取文件的绝对路径,从而读取文件内容。

但是从api 29开始MediaStore.Files.FileColumns.DATA字段已经废弃了,如果想读取文件内容,可以使用FileDescriptor:

    private  void getContentResolverInfo(Uri uri, int width, int height, SlideFactory.MediaType mediaType) {
        Cursor cursor = null;
        long   start  = System.currentTimeMillis();

        try {
            cursor = context.getContentResolver().query(uri, null, null, null, null);

            if (cursor != null && cursor.moveToFirst()) {
                String fileName = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
                long   fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE));
                //long   filePath = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) );

                ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri,"rw");
                FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
                String keystoreContent = FileUtils.readFileContent(fileDescriptor);

                FileInputStream fileInputStream = new FileInputStream(fileDescriptor);

                String mimeType = context.getContentResolver().getType(uri);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null)
                cursor.close();
        }
    }

    public static String readFileContent( FileDescriptor fileDescriptor) {
        Log.i(TAG, "readFileContent(), fileDescriptor=" + fileDescriptor);
        if(fileDescriptor == null) {
            return null;
        }
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(fileDescriptor);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.defaultCharset());
        BufferedReader reader = new BufferedReader(inputStreamReader);
        StringBuffer sb = new StringBuffer("");
        String line;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                sb.append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                reader.close();
                inputStreamReader.close();
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

stackoverflow上的一个回答:
在这里插入图片描述
在这里插入图片描述

项目之前的compileSdkVersion是28,而项目新版本的源码更新了compileSdkVersion是30,而Android系统从api 29开始不能根据MediaStore.Files.FileColumns.DATA字段直接读取ContentResolver中的文件内容,要根据文件描述符FileDescriptor进行读取文件内容。

参考:
https://stackoverflow.com/questions/61809732/android-data-does-not-exist-on-getcontentresolver

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值