关于安卓调用文件浏览器(一)打开并复制

背景

最近在做一个硬件产品,安卓应用开发。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------------------------------------------------------------------------------------------------------------

相关推荐
louisgeek几秒前
Android OkHttp Interceptor
android
大王派来巡山的小旋风5 分钟前
Kotlin基本用法三
android·kotlin
Jerry说前后端40 分钟前
Android 移动端 UI 设计:前端常用设计原则总结
android·前端·ui
bytebeats41 分钟前
Jetpack Compose 1.9: 核心新特性简介
android·android jetpack
Icey_World44 分钟前
Mysql笔记-错误条件\处理程序
android
大王派来巡山的小旋风2 小时前
Kotlin基本用法之集合(一)
android·程序员·kotlin
用户2018792831672 小时前
智能广播系统(RemoteCallbackList)的诞生
android
用户2018792831673 小时前
Binder 同应用内(本地)通信是否存在 1MB 大小限制?
android
一条上岸小咸鱼3 小时前
Kotlin 基本数据类型(四):String
android·前端·kotlin
Onion_994 小时前
学习下Github上的Android CICD吧
android·github