[DESCRIPTION]

在文件管理器中播放录音文件(.3gp 或者 .ogg)时,默认是用 video player 播放,如何修改使其可以选择音乐播放器播放?

[SOLUTION]

  1. 涉及文件:
  2. 1FileManager/src/com/mediatek/filemanager/service/FileManagerService.java
  3. 2FileManager/src/com/mediatek/filemanager/FileInfo.java
  4. 3Music/AndroidManifest.xml

请修改如下:

1. 恢复 FileManagerService.java 中被注释掉的函数:

public String update3gppMimetype(FileInfo fileInfo) 及其函数体

  1. public String update3gppMimetype(FileInfo fileInfo) {
  2. LogUtils.d(TAG, "update3gppMimetype...");
  3. String mimeType = FileInfo.MIMETYPE_3GPP_VIDEO;
  4. ContentResolver resolver = getContentResolver();
  5. if (resolver != null && fileInfo != null) {
  6. // fileInfo.setFileMimeType(FileInfo.MIMETYPE_3GPP_VIDEO);
  7. final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  8. final String[] projection = new String[] { MediaStore.MediaColumns.MIME_TYPE };
  9. final String selection = MediaStore.MediaColumns.DATA + "=?";
  10. final String[] selectionArgs = new String[] { fileInfo
  11. .getFileAbsolutePath() };
  12. Cursor cursor = null;
  13. try {
  14. cursor = resolver.query(uri, projection, selection,
  15. selectionArgs, null);
  16. LogUtils.d(TAG, "update3gppMimetype,file:" + fileInfo.getFileAbsolutePath());
  17. if (cursor != null && cursor.moveToFirst()) {
  18. mimeType = cursor.getString(cursor
  19. .getColumnIndex(MediaStore.MediaColumns.MIME_TYPE));
  20. LogUtils.d(TAG, "update3gppMimetype mimeType: " + mimeType);
  21. } else {
  22. mimeType = fileInfo.getFileOriginMimeType();
  23. LogUtils.d(TAG, "update3gppMimetype, not find from media,origin mimeType: " + mimeType);
  24. if (mimeType == null) {
  25. mimeType = FileInfo.MIMETYPE_3GPP_VIDEO;
  26. }
  27. }
  28. } finally {
  29. if (cursor != null) {
  30. cursor.close();
  31. }
  32. }
  33. }
  34. return mimeType;
  35. }

添加导包:

  1. import android.content.ContentResolver;
  2. import android.database.Cursor;
  3. import android.net.Uri;
  4. import android.provider.MediaStore;

2. 恢复 FileInfo.java 中的部分代码;

  1. private static HashMap<String, String> sMimeType3GPPMap = new HashMap<String, String>();

public String getFileMimeType(FileManagerService service) 中被注释的代码:
///M:@#3gp#@{the follow code is to handle the 3gp file.not do special handle now 这个注释以下的所有内容

  1. ///M:@#3gp#@{the follow code is to handle the 3gp file.not do special handle now
  2. if (mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP_UNKONW)) {
  3. mimeType = service.update3gppMimetype(this);
  4. }
  5. if (mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP_AUDIO)
  6. || mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP_VIDEO)
  7. || mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP2_VIDEO)) {
  8. String name = null;
  9. int sepIndex = mName.lastIndexOf("(");
  10. if (sepIndex > 0) {
  11. name = mName.substring(0, sepIndex);
  12. } else {
  13. name = mName.substring(0, mName.indexOf("."));
  14. }
  15. LogUtils.d(TAG, "getFileMimeType ,record the mimetype: " + mimeType + ",name = "
  16. + name + ",mName = " + mName);
  17. sMimeType3GPPMap.put(name, mimeType);
  18. }
  19. ///@the top code is to handle the 3gp file.not do special handle now}
  • private String getMimeType(File file) 中被注释掉的代码:
    ///M:#3gp#@{the follow code is to handle the 3gp file.not do special handle now 这个注释以下的所有内容

    1. ///M:#3gp#@{the follow code is to handle the 3gp file.not do special handle now
    2. // sp ecial solution for checking 3gpp original mimetype
    3. // 3gpp extension could be video/3gpp or audio/3gpp
    4. if (mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP_VIDEO)
    5. || mimeType.equalsIgnoreCase(FileInfo.MIMETYPE_3GPP2_VIDEO)) {
    6. LogUtils.d(TAG, "getMimeType, a 3gpp or 3g2 file,mimeType=" + mimeType);
    7. return FileInfo.MIMETYPE_3GPP_UNKONW;
    8. }
    9. ///M:@{the top code is to handle the 3gp file.not do special handle now
  • 被注释掉的函数 public String getFileOriginMimeType() 全部恢复 ```java ///M:@#3gp#{the follow code is to handle the 3gp file.not do special handle now public String getFileOriginMimeType() { String key = null; LogUtils.d(TAG, “getFileOriginMimeType, mName =” + mName); int sepIndex = mName.lastIndexOf(“(“); if (sepIndex > 0) {

    1. key = mName.substring(0, sepIndex);

    } else {

    1. key = mName.substring(0, mName.indexOf("."));

    } LogUtils.d(TAG, “getFileOriginMimeType,key is:” + key); String orginalMimeType = sMimeType3GPPMap.get(key); LogUtils.d(TAG, “getFileOriginMimeType, OrginalMimeType=” + orginalMimeType); if (orginalMimeType != null) {

    1. sMimeType3GPPMap.remove(key);

    } return orginalMimeType;

} ///M:@{the top code is to handle the 3gp file.not do special handle now

  1. - 添加导包
  2. ```java
  3. import java.util.HashMap;

3. 在 music 的 androidManifest.xml 中,在

<activity android:name="com.android.music.MediaPlaybackActivity"
下添加如下intent filter:

  1. <intent-filter android:priority="1">
  2. <action android:name="android.intent.action.VIEW" />
  3. <category android:name="android.intent.category.DEFAULT" />
  4. <data android:scheme="file"/>
  5. <data android:mimeType="audio/*"/>
  6. <data android:mimeType="application/ogg"/>
  7. <data android:mimeType="application/x-ogg"/>
  8. <data android:mimeType="application/itunes"/>
  9. <data android:mimeType="application/aac"/>
  10. <data android:mimeType="application/imy"/>
  11. <data android:mimeType="application/3gpp"/>
  12. </intent-filter>