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

背景

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

相关推荐
Android系统攻城狮9 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
mmsx13 小时前
Android 地图数据链路:从 GDAL、KML 到多引擎适配
android·kotlin
2601_9689007713 小时前
大模型版本回归评估实战:从能力指标到额度口径的完整链路
android·数据挖掘·回归
ao-weilai15 小时前
MySQL数据库:基本查询
android·数据库·mysql
事圆则缓16 小时前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
ao-weilai19 小时前
MySQL数据库:内置函数
android·数据库·mysql
SWAGGY..19 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Android打工仔19 小时前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读