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