Android 问题件选择报错java.lang.IllegalArgumentException
参考文章 链接: link.
1、报错日志
测试手机为8.0时
java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/browser/100167000013.xls"
at java.lang.Long.parseLong(Long.java:590)
at java.lang.Long.valueOf(Long.java:804)
测试手机为9.0时
java.lang.IllegalArgumentException: Unknown URI: content://downloads/public_downloads/571
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
at android.content.ContentResolver.query(ContentResolver.java:804)
at android.content.ContentResolver.query(ContentResolver.java:753)
at android.content.ContentResolver.query(ContentResolver.java:711)
2、图片选择为下载目录文件时(最开始的获取方法为):
} else if (isDownloadsDocument(uri)) {
return getDataColumn(context, uri, null, null);
}
public static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) throws Exception{
Cursor cursor = null;
final String column = "_data";
final String[] projection = { column };
try{
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if(cursor != null && cursor.moveToFirst()){
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
}catch (Exception e){
//G3Logger.debug(TAG + "getDataColumn>>Exception");
}finally{
if(cursor != null)
cursor.close();
}
return null;
}
8.0的修复方案只需要添加判断即可:raw:/storage/emulated/0/Download/browser/100167000013.xls
final String docId = DocumentsContract.getDocumentId(uri);
if (docId.startsWith("raw:")) {
final String path = docId.replaceFirst("raw:", "");
return path;
}
9.0的修复方案较为模糊
第一步 新增两种URI (好像没有效果)
String[] contentUriPrefixesToTry = new String[]{
"content://downloads/public_downloads",
"content://downloads/my_downloads",
"content://downloads/all_downloads"
};
for (String contentUriPrefix : contentUriPrefixesToTry) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
try {
String path = getDataColumn(context, contentUri, null, null);
if (path != null) {
G3Logger.debug("isDownloadsDocument(uri)>>>获取地址成功---" + path);
return path;
}
} catch (Exception e) {
}
}
第二步 (获取成功) 如果前两个获取失败则进行第三方式 把文件复制到工程的缓存目录中
文件路径为 /data/user/0/包名/cache/documents/100167000013.xls
// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
String fileName = FileUtils.getFileName(context, uri);
File cacheDir = FileUtils.getDocumentCacheDir(context);
File file = FileUtils.generateFileName(fileName, cacheDir);
String destinationPath = null;
if (file != null) {
destinationPath = file.getAbsolutePath();
FileUtils.saveFileFromUri(context, uri, destinationPath);
}
G3Logger.debug("isDownloadsDocument(uri)--FileUtils获取地址>>>" + destinationPath);
return destinationPath;
FileUtils.java 参考链接 link.
来源:CSDN
作者:静想晨曦
链接:https://blog.csdn.net/asia_mrli/article/details/99750619