Android Beam 文件传输失败分析与解决方法

最近在修改Android7.0原生平台的一些bug,其中有关Android Beam传输文件的一些问题还是蛮多的。所以特地找时间总结下曾经踏过的坑。

1.传输的文件名包含中文时,导致传输失败

可能是由于Google未考虑到本地化差异,导致在传输中文文件名的文件时直接提示传输失败。

packages\apps\Nfc\src\com\android\nfc\beam\MimeTypeUtil.java

其实,上面忘了说了,只是从文件管理器中进入Android Beam分享才会出现上面的问题。因为当从其他途径,比如说从图库中去分享图片,由于是通过content uri(content://com.xx.xxx/xxx)形式分享的,所以并不会直接包含文件真实路径,也就不存在中文问题了。

当从文件管理器中进入Android Beam分享时,是通过file uri(file://storage/xxx/aa.jpg)形式分享的,在获取文件的mimeType的时候会走 else if 里面的流程。

frameworks\base\core\java\android\webkit\MimeTypeMap.java

从上面代码可以看到,在获取文件后缀名的时候,在最后对文件名做了正则匹配,包含中文的文件名肯定匹配失败,导致最后返回空的后缀,所以也就返回null的mimeType。最终导致了文件传输失败。

既然问题找出来了,修改方法也就比较简单了,将上面那一层正则判断去掉即可;由于这个是在fwk中的方法,为了不影响其他模块的调用。你也可以将整个方法copy到nfc模块中,然后将正则判断去掉。

2.传输的文件名包含特殊字符时,导致传输失败

比如文件名包含 “#” 时,会导致传输失败。其实这个问题里面包含两个问题:
(1).从文件管理器中通过Android Beam分享时,直接传输失败。
其实,这个问题跟上面1中的问题也是类似的:

frameworks\base\core\java\android\webkit\MimeTypeMap.java

假如将1中的问题修复了,即下面的正则判断去除了,最后还是返回null的mimeType,导致传输失败。修复方法也比较简单,将上面的 “#” 处理代码去除,同时也需要将下面的正则判断去除。

(2).修复了(1)中的问题后,测试了几下发现不管是通过文件管理器还是图库都提示传输失败,不过跟上面不一样的是:
通知栏进度显示是传输完毕了的,已经100%了,但是过了一会儿接收端就提示传输失败了,发送端显示传输成功。

通过查看,文件也确实是传到了接收端,不过不是在beam目录下,而是在bluetooth目录下。我们都知道,Android Beam传输文件其实底层是通过蓝牙来实现传输的。只不过接收端和发送端并不需要蓝牙的配对,而是通过nfc来建立双方的连接。

分析代码流程发现,文件首先传输到了bluetooth文件夹下,然后通过renameTo将传输到bluetooth目录中的文件移动到beam目录下。

packages\apps\Nfc\src\com\android\nfc\beam\BeamTransferManager.java

所以怀疑在renameTo的时候出现了异常,log中也印证了这一点。而且srcFile打印的文件路径中将文件名中的 “#”去除了,所以在bluetooth目录下就找不到这个文件了,renameTo当然会失败。

通过一步步跟踪传递uri参数的地方,发现Bluetooth模块通过广播发送过来的uri是纯粹的文件路径,/storage/emulated/0/bluetooth/weeww#.jpg。所以getScheme返回的是null,调用uri.getPath的时候,自动将文件路径中的”#” 去除了。

packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java

解决方法也比较简单,我们不调用uri.getPath就行了,直接将uriString传进构造File的参数中。

packages\apps\Nfc\src\com\android\nfc\beam\BeamStatusReceiver.java

总结

以上所述是小编给大家介绍的Android Beam 文件传输失败分析与解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android Beam 文件传输失败分析与解决方法

    最近在修改Android7.0原生平台的一些bug,其中有关Android Beam传输文件的一些问题还是蛮多的.所以特地找时间总结下曾经踏过的坑. 1.传输的文件名包含中文时,导致传输失败 可能是由于Google未考虑到本地化差异,导致在传输中文文件名的文件时直接提示传输失败. packages\apps\Nfc\src\com\android\nfc\beam\MimeTypeUtil.java 其实,上面忘了说了,只是从文件管理器中进入Android Beam分享才会出现上面的问题.因为当

  • Android 微信文件传输助手文件夹

    微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很多童鞋都找不到微信文件传输助手文件夹在哪,就让我们一起找找吧 1.先说说手机微信文件传输助手文件夹在哪吧 文件夹路径为/Tencent/MicroMsg/Download/ 2.电脑版微信文件传输助手文件夹在:/微信安装保存目录/wechat files/微信号/ 也可以点击接收到的图片下载保存到相应位置即可 以上就是Android 微信文件传输助手文件夹的寻找,希望能帮助到您,谢谢大家对本站的支持!

  • Android Force Close 出现的异常原因分析及解决方法

    一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

  • pandas读取csv文件提示不存在的解决方法及原因分析

    一般情况是数据文件没有在当前路径,那么它是无法读取数据的.另外,如果路径名包含中文它也是无法读取的. (1)可以选择: import os os.getcwd() 获得当前的工作路径,把你的数据文件放在此路径上就可以了,就可以直接使用pd.read_csv("./_.csv") (2)可以选择: 使用os.chdir(path),path是你的那个数据文件路径 (3)可以选择: 不更改路径,直接调用df=pd.read_csv(U"文件存储的盘(如C盘) :/文件夹/文件名.

  • IDEA创建yml文件不显示小树叶创建失败问题的解决方法

    不知道自己干了什么骚操作,在创建yml文件时,出现了以下问题: 这不单单是没有显示小树叶的问题,而是真的没法用,而且是在YAML插件全部安装的情况下出现了这样的问题. 通过一番搜索,现解决方法如下: 打开setting-File Types: 找到Text,在以下列表中找到自己创建的失效的application.yml,点击右边的减号将其删除,应用,问题解决. 附录:SpringBoot项目yml文件 不显示绿色小树叶的问题 方法1: 显示为灰色或者是表格样式的, 1.确认idea是否安装yam

  • CentOS 7下MySQL服务启动失败的快速解决方法

    今天,启动MySQL服务器失败,如下所示: [root@spark01 ~]# /etc/init.d/mysqld start Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe&qu

  • CentOS下使用yum安装python-pip失败的完美解决方法

    以前用Ubuntu的时候感觉很简单的事到ContOS上却变得很头痛,在执行以下命令安装python-pip居然什么也没执行. yum install python-pip 后来google了一下说是这个包在EPEL源里,要添加EPEL源才可以.然后按博客里说的方法添加,执行以下命令: sudo rpm -ivh epel-release* 但是最后提示系统里已经安装了最新的epel包,但为什么却用不了呢?google了一天多都没有结果,最后在一个博客看到一句话让我找到了方向.CentOS中有的源

  • efang设置出现读取Serv-U路径失败330101的解决方法

    读取Serv-U路径失败330101的解决方法 我安装的易方怎么不能设置Serv-U啊? 点设置就出现 读取Serv-U路径失败330101. 谁知道这是怎么会事啊??我安装了Serv-U的...希望知道的告诉我一下 解决方法: 把serv-u的用户数据 存储到注册表里去,不是放在ini文件里

  • svn 清理失败 (cleanup 失败) 的快速解决方法

    1.cmd指令,进入.svn目录,找到wc.db文件 sqlite 3 打开 2. 对 svn源代码目录 右键, clean up, 稍等1至5分钟左右,然后会提示 清理成功 以上就是小编为大家带来的svn 清理失败 (cleanup 失败) 的快速解决方法全部内容了,希望大家多多支持我们~

  • Mysql 安装失败的快速解决方法

    在安装mysql的过程中,出现的最麻烦的问题和解决方法 安装后,启动不成功,就卡了,程序就没有响应. 如何解决: 找到mysql安装目录下的 #Path to the database root datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" 该目录就是用来存放我们将来创建的数据库和表的目录, 你只需要将 C:/ProgramData/MySQL/MySQL Server 5.5 删除,再重新安装就可以. 下面看下window

随机推荐