天天看點

Android實作選擇本地音樂

Android實作選擇本地音樂

    • 一、目标
    • 二、實作代碼
    • 三、遇到的問題
    • 四、過程回顧
    • 五、優化方案
    • 六、接下來
    • 七、Finally

一、目标

神馬筆記實作在筆記中添加音樂。

Android實作選擇本地音樂

二、實作代碼

final String type = "audio/*";
final String[] mimeTypes = null;

boolean result = PackageUtils.pick(this.getActivity(), this,
                                   type, mimeTypes,
                                   documentOnly, c);

return result;
           
public static final boolean pick(Activity context, Fragment fragment,
                                 String type, String[] mimeTypes,
                                 boolean documentOnly, int requestCode) {

  boolean result = false;

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

  ArrayList<String> list = new ArrayList<>();
  list.add(Intent.ACTION_OPEN_DOCUMENT); 
  list.add(Intent.ACTION_GET_CONTENT); 

  if (!documentOnly) {
    list.add(0, Intent.ACTION_PICK);
  }

  for (String action : list) {
    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支援不一緻 堅果手機2和榮耀暢玩7不支援

ACTION_PICK

,隻能以

ACTION_OPEN_DOCUMENT

方式調用第三方應用。

紅米6Pro則同時支援

ACTION_PICK

ACTION_OPEN_DOCUMENT

ACTION_OPEN_DOCUMENT體驗效果差

使用國内主流的音樂APP下載下傳音樂,ACTION_OPEN_DOCUMENT并不能及時發現新下載下傳的音樂,或者說音樂APP并沒有通知系統重新整理。

這樣一來,使用者必須導航到APP的音樂檔案夾進行選擇。

對于普通使用者來講,這将是一件極其困難的事情。

四、過程回顧

實作簡單,體驗欠佳,未來優化。

五、優化方案

在手機上下載下傳音樂,或者通過音樂APP,或者浏覽器、或者上傳到音樂檔案夾。

終歸是幾個有限的檔案夾,将來考慮直接顯示這些檔案夾的内容以供使用者選擇。

并且保留

ACTION_OPEN_DOCUMENT

提供給手機發燒友使用。

六、接下來

實作第三方播放音樂。

七、Finally

須菩提。于意雲何。

可以身相見如來不。

不也。世尊。

不可以身相得見如來。

何以故。

如來所說身相。即非身相。