帖子
帖子
用户
博客
课程
显示全部楼层
5
帖子
0
勋章
51
Y币

[插件开发] Android文件选择Download目录闪退解决思路及方案

[复制链接]
发表于 2020-11-6 17:30:56
最近客户返回之前实现的一个文件选择功能,选择文件后闪退或者无法选择文件,楼主看了一下,是使用了模块库里面的(selectFile)模块.


不过原模块不维护了,也没有可代替模块,楼主就决定自己来试着修复一下
===================================================================
根据这个模块的功能,应该是调用了安装自带的文件管理器
  1. Intent intent = new Intent("android.intent.action.GET_CONTENT");
  2. intent.setType("*/*");
  3. 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
      
  1. java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/QQMail/《昆明市招商引资“十四五”规划》课题结题评审会专家邀请函.doc"
  2.         at java.lang.Long.parseLong(Long.java:594)
  3.         at java.lang.Long.valueOf(Long.java:808)
  4.         at com.winflag.appdev.selectfile.FileUtils.getPhotoPathFromContentUri(FileUtils.java:311)
  5.         at com.winflag.appdev.selectfile.SelectFile.onActivityResult(SelectFile.java:51)
  6.         at com.uzmap.pkg.uzcore.m.a(Unknown Source:6)
  7.         at com.uzmap.pkg.uzcore.UZAppActivity.onActivityResult(Unknown Source:14)
  8.         at android.app.Activity.dispatchActivityResult(Activity.java:8412)
  9.         at android.app.ActivityGroup.dispatchActivityResult(ActivityGroup.java:128)
  10.         at android.app.ActivityThread.deliverResults(ActivityThread.java:5582)
  11.         at android.app.ActivityThread.handleSendResult(ActivityThread.java:5630)
  12.         at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
  13.         at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
  14.         at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
  15.         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
  16.         at android.os.Handler.dispatchMessage(Handler.java:110)
  17.         at android.os.Looper.loop(Looper.java:219)
  18.         at android.app.ActivityThread.main(ActivityThread.java:8349)
  19.         at java.lang.reflect.Method.invoke(Native Method)
  20.         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
  21.         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获取到文件才可
   具体判断代码如下:
   
  1. final String id = DocumentsContract.getDocumentId(uri);

  2.                 if (id != null && id.startsWith("raw:")) {
  3.                     return id.substring(4);
  4.                 }

  5.                 String[] contentUriPrefixesToTry = new String[]{
  6.                         "content://downloads/public_downloads",
  7.                         "content://downloads/my_downloads",
  8.                         "content://downloads/all_downloads"
  9.                 };

  10.                 for (String contentUriPrefix : contentUriPrefixesToTry) {
  11.                     Uri contentUri = ContentUris.withAppendedId(Uri.parse(contentUriPrefix), Long.valueOf(id));
  12.                     try {
  13.                         String path = getDataColumn(context, contentUri, null, null);
  14.                         if (path != null) {
  15.                             return path;
  16.                         }
  17.                     } catch (Exception e) {}
  18.                 }

  19.                 // path could not be retrieved using ContentResolver, therefore copy file to accessible cache using streams
  20.                 String fileName = getFileName(context, uri);
  21.                 File cacheDir = getDocumentCacheDir(context);
  22.                 File file = generateFileName(fileName, cacheDir);
  23.                 String destinationPath = null;
  24.                 if (file != null) {
  25.                     destinationPath = file.getAbsolutePath();
  26.                     saveFileFromUri(context, uri, destinationPath);
  27.                 }

  28.                 return destinationPath;
复制代码
大家可以自己动手去实现 , 也可以等待我上传的模块 getFile 来解决这个问题







380
帖子
4
勋章
6
Y币
支持
3
帖子
0
勋章
42
Y币
华为P30,直接选择PDF文件上传会闪退;但是点击文档按钮后,再上传可以成功。
3
帖子
0
勋章
42
Y币
getFile模块,
华为P30,直接选择PDF文件上传会闪退;但是点击文档按钮后,再上传可以成功。
28
帖子
3
勋章
5050
Y币
华为P30 pro不选择文档会出现闪退,麻烦看一下
34
帖子
1
勋章
2586
Y币
  1. java.lang.RuntimeException:
  2.   at android.app.ActivityThread.deliverResults (ActivityThread.java:5471)
  3.   at android.app.ActivityThread.handleSendResult (ActivityThread.java:5512)
  4.   at android.app.servertransaction.ActivityResultItem.execute (ActivityResultItem.java:51)
  5.   at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:149)
  6.   at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:103)
  7.   at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2386)
  8.   at android.os.Handler.dispatchMessage (Handler.java:107)
  9.   at android.os.Looper.loop (Looper.java:213)
  10.   at android.app.ActivityThread.main (ActivityThread.java:8178)
  11.   at java.lang.reflect.Method.invoke (Native Method)
  12.   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:513)
  13.   at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)
  14. Caused by: java.lang.NumberFormatException:
  15.   at java.lang.Long.parseLong (Long.java:594)
  16.   at java.lang.Long.valueOf (Long.java:808)
  17.   at com.apicould.moduleGetFile.FileUtils.getLocalPath (FileUtils.java:336)
  18.   at com.apicould.moduleGetFile.FileUtils.getPath (FileUtils.java:283)
  19.   at com.apicould.moduleGetFile.GetFile.onActivityResult (GetFile.java:70)
  20.   at com.uzmap.pkg.uzcore.m.a (Unknown Source:6)
  21.   at com.uzmap.pkg.uzcore.UZAppActivity.onActivityResult (Unknown Source:14)
  22.   at android.app.Activity.dispatchActivityResult (Activity.java:8413)
  23.   at android.app.ActivityGroup.dispatchActivityResult (ActivityGroup.java:128)
  24.   at android.app.ActivityThread.deliverResults (ActivityThread.java:5464)
复制代码

错误日志
34
帖子
1
勋章
2586
Y币

这个模块还是会闪退,麻烦帮忙联系下作者
5
帖子
0
勋章
51
Y币
高仕达 发表于 2021-3-31 18:06
这个模块还是会闪退,麻烦帮忙联系下作者

模块已更新
0
帖子
0
勋章
2
Y币
博主您好
       String fileName = getFileName(context, uri);
                File cacheDir = getDocumentCacheDir(context);
                File file = generateFileName(fileName, cacheDir);
这几个方法的具体实现是什么样的
您需要登录后才可以回帖 登录

本版积分规则