Android 安卓数据&x27;getContentResolver上不存在
getColumnIndexOrThrow引发异常的原因可能是什么 java.lang.IllegalArgumentException:列“\u data”不存在。可用列:[] 但是,如果您重命名该文件并再次重试,它会工作吗Android 安卓数据&x27;getContentResolver上不存在,android,android-contentresolver,Android,Android Contentresolver,getColumnIndexOrThrow引发异常的原因可能是什么 java.lang.IllegalArgumentException:列“\u data”不存在。可用列:[] 但是,如果您重命名该文件并再次重试,它会工作吗 private static String getDataColumn(Context context, Uri uri, String selection, String[] selectio
private static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String[] projection = {
MediaStore.Files.FileColumns.DATA
};
try {
cursor = context.getContentResolver().query(
uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int cindex = cursor.getColumnIndexOrThrow(projection[0]);
return cursor.getString(cindex);
}
}
catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
原始文件的目的是
content://com.sec.android.app.myfiles.FileProvider/device_storage/Download/myfile.pdf
然而,重命名后的文件以
内容://0@media/外部/file/588此
MediaStore.Files.FileColumns.DATA
已被弃用,并且列'\u DATA'
不再存在
如上所述
此常量在API级别29中被弃用。
应用程序可能没有直接访问此路径的文件系统权限。
而不是尝试
若要直接打开此路径,应用程序应使用
ContentResolver#openFileDescriptor(Uri,字符串)以获得访问权限
如何使用openFileDescriptor?
我尝试在应用程序中提供两个不同的广泛使用的文件的示例
图像文件
关于如何处理位图
非图像文件
关于如何处理FileInputStream
和FileOutputStream
结论
试图获得绝对路径
是没有意义的,尽管这是没有必要的,除非提出安全和隐私问题。事实上,相对路径
足以处理文件,在内核模式
和用户模式
之间有抽象表示实现
,可以将相对路径
映射到绝对路径
,用户不需要知道
openFileDescriptor
速度非常快,与所有android版本兼容此MediaStore.Files.FileColumns.DATA
已被弃用,并且不再存在column'\u DATA'
如上所述
此常量在API级别29中被弃用。
应用程序可能没有直接访问此路径的文件系统权限。
而不是尝试
若要直接打开此路径,应用程序应使用
ContentResolver#openFileDescriptor(Uri,字符串)以获得访问权限
如何使用openFileDescriptor?
我尝试在应用程序中提供两个不同的广泛使用的文件的示例
图像文件
关于如何处理位图
非图像文件
关于如何处理FileInputStream
和FileOutputStream
结论
试图获得绝对路径
是没有意义的,尽管这是没有必要的,除非提出安全和隐私问题。事实上,相对路径
足以处理文件,在内核模式
和用户模式
之间有抽象表示实现
,可以将相对路径
映射到绝对路径
,用户不需要知道
openFileDescriptor
速度非常快,并且与所有android版本兼容,因此如果我在原始文件上使用uri.getPath(),路径返回(无效)为/device\u storage/Download/myFile.pdf
,这是我的文件打开例程的无效路径,但是,如果我重命名它并重试,它会返回:/storage/emulated/0/Download/myFile.pdf
,这会很好地打开文件吗?想法?任何人都知道为什么MyFiles应用程序会出现此问题,但是其他浏览器应用程序会发送正确的getData()?请解释您实际上在尝试做什么?你之前所做的和之后所期待的。当抛出这个异常时,我有一个活动来处理文件的打开,并在清单中注册该类型,以便我可以用来打开该类型的文件。在一种情况下,getData()返回一个未解析为有效文件路径的字符串,如上文所示。但是,如果我在External file exporer中重命名文件并重试,返回的getData字符串是有效的。我会在答案中添加额外的材料。因此,如果我只是在原始文件上使用uri.getPath(),路径返回(无效)为/device\u storage/Download/myFile.pdf
,这是我的文件打开例程的无效路径,但是,如果我重命名它并重试,它会返回:/storage/emulated/0/Download/myFile.pdf
,这会很好地打开文件吗?想法?任何人都知道为什么MyFiles应用程序会出现此问题,但是其他浏览器应用程序会发送正确的getData()?请解释您实际上在尝试做什么?你之前所做的和之后所期待的。当抛出这个异常时,我有一个活动来处理文件的打开,并在清单中注册该类型,以便我可以用来打开该类型的文件。在一种情况下,getData()返回一个未解析为有效文件路径的字符串,如上文所示。但是,如果我在External file exporer中重命名该文件并重试,则返回的getData字符串是有效的。我会在答案中添加额外的材料。使用intent.getData().getPath这样做是否正确?如果是这样,MyFiles发送的数据仍然中断,但是其他文件浏览器应用程序发送了正确的信息?这是一个运行Android 10的Note10 Plus,谢谢你的解释。我的问题是,我必须向正在调用的库传递一个绝对路径字符串,而不是描述符或流。使用intent.getData().getPath是否正确?如果是这样,MyFiles发送的数据仍然中断,但是其他文件浏览器应用程序发送了正确的信息?这是一个运行Android 10的Note10 Plus,谢谢你的解释。我的问题是,我必须将绝对路径字符串传递给我正在调用的库,而不是描述符或流。
if(uri==null)return;
ContentResolver contentResolver = getActivity().getContentResolver();
if(contentResolver==null)return;
ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(uri,"rw");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
if(fileDescriptor==null)return;
Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
if(uri==null)return;
ContentResolver contentResolver = getActivity().getContentResolver();
if(contentResolver==null)return;
ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(uri,"rw");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
if(fileDescriptor==null)return;
FileInputStream fileInputStream = new FileInputStream(fileDescriptor);
FileOutputStream fileOutputStream = new FileOutputStream(fileDescriptor);
parcelFileDescriptor.close();