天天看點

Android實作選擇視訊功能

Android實作選擇視訊功能

    • 一、目标
    • 二、實作方案
    • 三、一些測試
      • 1. 同時選擇圖檔和視訊
      • 2. 選擇音頻
    • 四、最終實作
    • 五、開發過程回顧
    • 六、接下來
    • 七、Finally

在上一篇文章《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進行不同的參數配置。

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

如是滅度無量無數無邊衆生。

實無衆生得滅度者。

何以故。

須菩提。

若菩薩有我相。人相。衆生相。壽者相。

即非菩薩。