背景
最近在做一个硬件产品,安卓应用开发。PM抽风,要求从app打开文件浏览器,跳转到指定目录,然后可以实现文件复制粘贴操作。
思考
从应用开发的角度看,从app打开系统文件浏览器并且选择文件,这是很常见的事情。但是如果打开了文件浏览器,却不选择文件,而是要对文件进行长按复制黏贴,可以是不合理也不常规的,武断一点说,这个需求就压根没有进行过技术调研,技术评审。但是接都接下来了,干就完了。
开发环境
win10,as4+,jdk8+,硬件应用系统android9
过程
(1)通过adb,把系统的文件浏览器进行打包,然后通过复制apk到本地,进行源码查看。
这里涉及到的adb指令就不说了,主要讲一下,就是通过jadx,查看文件浏览器的源码。
这里有三个注意的点:
(1-1)这个文件浏览器,就是安卓官方的浏览器,看包名:ccom.android.documentsui,这个就是安卓标准的文件浏览器包名。这里再看PickActivity就是我们应用常规调用文件浏览器选择文件时打开的页面,而FilesActivity就是文件浏览器的入口页。
上面的说法,是有证据支持的,请看AndroidManifest.xml文件:
这些就是这两个activity的相关定义,足够知道这些activity都到是干什么的了。继续,看这个类:ActionHandler
这里就是处理两个activity的方法的一个类,封装后统一处理。
好,上面对类的定义,有一个大概的了解了,接下来,就进行开发。
(2)跳转页面
常规的调用,打开的文件选择页面后,是无法进行复制黏贴的,所以这里跳转的类,肯定是FilesActivity。且我们已经知道包名了,因此,可以通过包名,类名,就可以打开一个app了。核心代码如下:
Intent intent = new Intent();
intent.setClassName("com.android.documentsui", "com.android.documentsui.files.FilesActivity");
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:" + "PhdBackUp");
intent.setAction("android.intent.action.VIEW");
intent.setData( uri);
startActivity(intent);
这里的包名:com.android.documentsui
类名:com.android.documentsui.files.FilesActivity
uri参数:content://com.android.externalstorage.documents/document/primary:加对应的一级目录。
这里的写法,通过测试,某些机型是可以的。但是去到安卓12以上,或者显式声明了Activity的export是false,就不能通过外部调用打开了。
本以为问题到此解决,实际测试的时候,发现路径还得需要对特定的系统进行适配。例如这个产品是魔改过的room,那么它的uri是不一样的,因此需要调试,但是原理上,就大致一致的。
上述内容,仅仅是对特定系统的一种需求实现思路总结,目前该方案实测并不是兼容很好,所以不建议普及使用。
that's all------------------------------------------------------------------------------------------------------------