最近客户返回之前实现的一个文件选择功能,选择文件后闪退或者无法选择文件,楼主看了一下,是使用了模块库里面的(selectFile)模块.
不过原模块不维护了,也没有可代替模块,楼主就决定自己来试着修复一下
===================================================================
根据这个模块的功能,应该是调用了安装自带的文件管理器
Intent intent = new Intent(“android.intent.action.GET_CONTENT”);
intent.setType(“*/*”);
intent.addCategory(“android.intent.category.OPENABLE”);
复制代码
了解了大概原理后,迅速写了个功能类似的模块出来
运行之后,发现和原来的selectFile模块一样 , 选择Download目录下的文件直接闪退,无法成功获取文件路径
经过对比
发现华为手机返回的路径格式如下 : content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/xxx
其它手机的返回格式如下:content://com.android.providers.downloads.documents/document/img:/3
报错日志一般都是无法将String转换为Double
java.lang.NumberFormatException: For input string: “raw:/storage/emulated/0/Download/QQMail/《昆明市招商引资“十四五”规划》课题结题评审会专家邀请函.doc”
at java.lang.Long.parseLong(Long.java:594)
at java.lang.Long.valueOf(Long.java:808)
at com.winflag.appdev.selectfile.FileUtils.getPhotoPathFromContentUri(FileUtils.java:311)
at com.winflag.appdev.selectfile.SelectFile.onActivityResult(SelectFile.java:51)
at com.uzmap.pkg.uzcore.m.a(Unknown Source:6)
at com.uzmap.pkg.uzcore.UZAppActivity.onActivityResult(Unknown Source:14)
at android.app.Activity.dispatchActivityResult(Activity.java:8412)
at android.app.ActivityGroup.dispatchActivityResult(ActivityGroup.java:128)
at android.app.ActivityThread.deliverResults(ActivityThread.java:5582)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5630)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
复制代码
针对下载目录文件里面 , 获取真实路径的方式 , 一般是通过文件ID去文件数据库里查询文件真实路径,华为的手机,可以直接截取 raw://的路径返回,
因国内手机厂商基本上都对android做过改动,无法像之前一样根据Id通过查询content://downloads/public_downloads目录获取到文件的真实路径,有的手机的路径是content://downloads/public_downloads, 而有的手机是content://downloads/my_downloads, 有的则是content://downloads/all_downloads,因此需要每一种路径下都查询是否能根据文件ID获取到文件才可
具体判断代码如下:
final String id = DocumentsContract.getDocumentId(uri);
if (id != null && id.startsWith(“raw:”)) {
return id.substring(4);
}
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) {
return path;
}
} catch (Exception e) {}
}
// path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
String fileName = getFileName(context, uri);
File cacheDir = getDocumentCacheDir(context);
File file = generateFileName(fileName, cacheDir);
String destinationPath = null;
if (file != null) {
destinationPath = file.getAbsolutePath();
saveFileFromUri(context, uri, destinationPath);
}
return destinationPath;
复制代码
大家可以自己动手去实现 , 也可以等待我上传的模块 getFile来解决这个问题
德
支持华为P30,直接选择PDF文件上传会闪退;但是点击文档按钮后,再上传可以成功。getFile模块,
华为P30,直接选择PDF文件上传会闪退;但是点击文档按钮后,再上传可以成功。
华为P30 pro不选择文档会出现闪退,麻烦看一下
java.lang.RuntimeException:
at android.app.ActivityThread.deliverResults (ActivityThread.java:5471)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:5512)
at android.app.servertransaction.ActivityResultItem.execute (ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2386)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:213)
at android.app.ActivityThread.main (ActivityThread.java:8178)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)
Caused by: java.lang.NumberFormatException:
at java.lang.Long.parseLong (Long.java:594)
at java.lang.Long.valueOf (Long.java:808)
at com.apicould.moduleGetFile.FileUtils.getLocalPath (FileUtils.java:336)
at com.apicould.moduleGetFile.FileUtils.getPath (FileUtils.java:283)
at com.apicould.moduleGetFile.GetFile.onActivityResult (GetFile.java:70)
at com.uzmap.pkg.uzcore.m.a (Unknown Source:6)
at com.uzmap.pkg.uzcore.UZAppActivity.onActivityResult (Unknown Source:14)
at android.app.Activity.dispatchActivityResult (Activity.java:8413)
at android.app.ActivityGroup.dispatchActivityResult (ActivityGroup.java:128)
at android.app.ActivityThread.deliverResults (ActivityThread.java:5464)
复制代码
错误日志
回答:
支持
这个模块还是会闪退,麻烦帮忙联系下作者
回答:
这个模块还是会闪退,麻烦帮忙联系下作者
模块已更新