android 打开h5文件下载,【APICloud】Android文件选择Download目录闪退解决思路及方案...

最近客户返回之前实现的一个文件选择功能,选择文件后闪退或者无法选择文件,楼主看了一下,是使用了模块库里面的(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)

复制代码

错误日志

回答:

支持

这个模块还是会闪退,麻烦帮忙联系下作者

回答:

这个模块还是会闪退,麻烦帮忙联系下作者

模块已更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值