谷歌原生DocumentUI文件浏览的原理

相信多数想了解谷歌DocumentUI设计思想的码农都会遇到障碍,文件浏览究竟是怎么实现的,进入DocumentUI的UI层,不难发现,我们是通过查询数据库获取cursor,但是查询的哪个数据库,怎么能够查询数据库就可以把文件层级一级级浏览呢?带着这些疑问,本地通过SourceInsight工具查找了所有的ContentProvider,谷歌原生有一个抽象类DocumentsProvider。


public abstract class DocumentsProvider extends ContentProvider

呢么,究竟是哪一个类实现了该Provider并实现了DocumentUI的数据提供功能呢?

带着这个问题,本地查找了所有的实现类,发现有一个类ExternalStorageProvider:

public class ExternalStorageProvider extends DocumentsProvider


正是该类实现这个接口。熟悉APN流程的码农应该都知道,数据库的创建.db是在TelephonyProvider.java中创建的,那么,是不是我们的DocumentUI的查询数据也是来自ExternalStorageProvider创建数据库,进行增、删、查找获取的呢?但是,查找该文件并没有找到与数据库相关的文件,是不是很好奇?

细心的人也会发现该类中有一个静态成员:

    public static final String AUTHORITY = "com.android.externalstorage.documents";

如果经常调试DocumentUI,或者使用该应用的功能,比如分享时,是不是遇到过该熟悉的Uri内容呢,本地启动DocumentUI.

C:\Users\xx>adb logcat | find "ExternalStorage"
09-14 14:34:48.829   520  1574 I ActivityManager: Start proc 7456:com.android.externalstorage/u0a10 for content provider com.android.externalstorage/.ExternalSt
orageProvider

根据log也可以看到ExternalStorageProvider 确认启动了。


在DocumentUI执行分享文件功能,查看下面log:

C:\Users\xx>adb logcat | find "Activity"

// 弹出选择分享功能界面

09-14 14:38:45.591   520   672 I ActivityManager: Displayed android/com.android.internal.app.ChooserActivity: +135ms

// 选择蓝牙,文件的mimeType 是通过 getTypeForFile(File file)接口获得,分享文件名ylog_debug,Uri如下:

// content://com.android.externalstorage.documents/document/CAB0-17E4%3Aylog%2Fap%2Fcurrent%2F00-0913_183933%2Fylog_debug
09-14 14:38:46.812   520  1596 I ActivityManager: START u0 {act=android.intent.action.SEND cat=[android.intent.category.DEFAULT] typ=application/octet-stream fl
g=0xb080001 cmp=com.android.bluetooth/.opp.BluetoothOppLauncherActivity clip={application/octet-stream U:content://com.android.externalstorage.documents/documen
t/CAB0-17E4%3Aylog%2Fap%2Fcurrent%2F00-0913_183933%2Fylog_debug} (has extras)} from uid 10013, pid -1


因此,DocumentUi实际数据提供者 是 ExternalStorageProvider毫无疑问,下面我们就可以对该文件进行简单分析。


    public Cursor queryChildDocuments(
            String parentDocumentId, String[] projection, String sortOrder)
            throws FileNotFoundException ;

当浏览文件夹时,点击进入该文件夹,需要通过 parent.listFiles()遍历列出所有文件,调用的是该接口。


private File getFileForDocId(String docId) throws FileNotFoundException;

通过入参DocumentId获取对应文件,该字符串格式: docId = CAB0-17E4:ylog/

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值