Android实现选择视频功能

Android实现选择视频功能

在上一篇文章《Android实现录像功能》中,实现了调用第三方应用实现录像功能。

接下来要实现选择本地视频以添加到笔记中。

一、目标

选择本地视频以添加到神马笔记中。

二、实现方案

Android提供了3个Action,可以实现选择视频功能。

Action 说明
ACTION_PICK 根据类型让用户选择第三方应用。
ACTION_OPEN_DOCUMENT 直接显示Document的选择界面,Android 4.4以上使用。
ACTION_GET_CONTENT 与ACTION_OPEN_DOCUMENT相同,Android 4.3及以下使用。

三、一些测试

1. 同时选择图片和视频

虽然使用ACTION_OPEN_DOCUMENT可以实现同时选择图片和视频,但无法区分用户最终的选择结果是图片还是视频。

Action 说明
ACTION_PICK 无法实现
ACTION_OPEN_DOCUMENT 通过设置EXTRA_MIME_TYPES可以实现。
红米6Pro测试结果是不支持视频,出现不了视频的分类,只能以文件方式选择。
ACTION_GET_CONTENT 与ACTION_OPEN_DOCUMENT相同。

2. 选择音频

Action 说明
ACTION_PICK 依赖于安装的应用。
坚果手机2上没有安装支持的应用,直接失败。
ACTION_OPEN_DOCUMENT OK的。
ACTION_GET_CONTENT 与ACTION_OPEN_DOCUMENT相同。

四、最终实现

同时使用3种Action,优先级分别为

  1. ACTION_PICK——可以选择自己常用的第三方应用
  2. ACTION_OPEN_DOCUMENT——使用系统的Document选择应用,需要适应一下
  3. ACTION_GET_CONTENT——与ACTION_OPEN_DOCUMENT一致,防御手段,提高适配

并且根据不同的Action对Intent进行不同的参数配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public static final boolean pick(Activity context, Fragment fragment, String type, String[] mimeTypes, int requestCode) {

boolean result = false;

if (context == null && fragment == null) {
return false;
}

String[] actionArray = new String[]{
Intent.ACTION_PICK,
Intent.ACTION_OPEN_DOCUMENT,
Intent.ACTION_GET_CONTENT,
};

for (String action : actionArray) {
if (action.equalsIgnoreCase(Intent.ACTION_PICK)) {
if (mimeTypes != null && mimeTypes.length > 1) {
continue;
}
}

Intent intent = new Intent();

intent.setAction(action);
intent.setType(type);

intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, false);

if (mimeTypes != null && mimeTypes.length > 0) {
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
}

if (action.equalsIgnoreCase(Intent.ACTION_OPEN_DOCUMENT)
|| action.equalsIgnoreCase(Intent.ACTION_GET_CONTENT)) {
intent.addCategory(Intent.CATEGORY_OPENABLE);
}

try {

if (fragment != null) {
fragment.startActivityForResult(intent, requestCode);
} else {
context.startActivityForResult(intent, requestCode);
}

result = true;

break;

} catch (Exception e) {
e.printStackTrace();
}
}

return result;
}

五、开发过程回顾

最初的开发目标是实现同时选择图片和视频,使用ACTION_OPEN_DOCUMENT确实可以实现这个功能,但必须使用系统Document的选择界面,个人觉得用户体验太差,因此放弃了这个方案。

因为嫌弃ACTION_OPEN_DOCUMENT的用户体验太差,所有优先使用ACTION_PICK,能保证更好的用户体验。

并且ACTION_PICK在坚果手机2、荣耀畅玩7、红米6Pro上都工作良好。

但是,使用ACTION_PICK选择音频时,坚果手机2和荣耀畅玩7都无法正常工作,因此决定同时使用2个ACTION,以保证可以顺利选择文件。

最后配合ACTION_GET_CONTENT,希望能提高兼容性。

六、接下来

神马笔记已经实现录像创建新的视频以及选择手机上已有的视频实现视频笔记的功能。

接下来实现视频笔记的播放功能。

七、Finally

如是灭度无量无数无边众生。 实无众生得灭度者。 何以故。

须菩提。 若菩萨有我相。人相。众生相。寿者相。 即非菩萨。