Android 调用系统应用选文件
我们通常会通过Intent调起系统应用进行选择文件,包括图片、视频、音频等,但是需要考虑不同系统版本的兼容性问题
系统版本 | action | accept_type(选择文件类型) |
---|---|---|
<19(4.4) | Intent.ACTION_GET_CONTENT | 通过intent.setType,设置一个字符串表示MIMEType:“image/*, video/*” |
>=19(4.4) | Intent.ACTION_OPEN_DOCUMENT |
|
all | Intent.ACTION_PICK | 通过setData设置URI,一次只能选择一种类型文件,且类型限于系统API提供的几种,通常选择联系人之类的使用 |
-
指定Intent.CATEGORY_OPENABLE,获取到的都是可以打开stream的URI,不能打开stream的URI不会被选择
-
使用ACTION_OPEN_DOCUMENT不可以直接拿到path(除非自己处理),但是可以直接打开stream读取内容(ACTION_GET_CONTENT和ACTION_PICK当然也可以)
-
H5的input标签会调用WebChromeClient的相应方法(openFileChooser()/onShowFileChooser())(这部分内容可以参考这篇文章),该方法回调会接收URI,并交给前端,前端可以通过URI展示具体文件。
-
ACTION_GET_CONTENT和ACTION_OPEN_DOCUMENT通过指定boolean类型的Intent.EXTRA_ALLOW_MULTIPLE(API18(4.3)才可以用),使用户可以选择多个文件返回,此时返回的URIs在data.getClipData()中,这里需要注意,在H5的input标签情景下,由于API21开始ValueCallback才接收Uri数组,所以在API18和API19中,不能设置为多选,否则回调只能处理一个Uri。
调用代码
//ACTION_GET_CONTENT ACTION_OPEN_DOCUMENT
val intent = Intent()
intent.addCategory(Intent.CATEGORY_OPENABLE)
if (android