Android提示ContentResolver:column ‘_data‘ does not exist.错误的解决方法

2023年10月30日

之前我们使用的通过URI获取文件路径的代码

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

但是在新的版本下会报错:

java.lang.IllegalArgumentException: column '_data' does not exist

主要原因是从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();
   }

© 1987 - 2023 张晓刚 版权所有

浙ICP备16002143号-1