Android如何从SD卡/文件管理器加载音频文件并播放它

时间:2017-02-08 10:46:15

标签: android audio android-intent uri action

我正在开发一个应用程序,在那个应用程序中我有一个名为“选择声音”的按钮。当用户单击此按钮时,应要求他/她从文件管理器/内存中选择任何音频文件。

所以,我知道为此,我将不得不使用Intent.Action_GetData。我也这样做:

//code start
Intent intent = new Intent();
intent.setType("audio/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,1);

@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data){

  if(requestCode == 1){

    if(resultCode == RESULT_OK){

        //the selected audio.
        Uri uri = data.getData(); 
int SoundID=soundPool.Load(uri.toString(), 1);
//SoundPool is already constructed and is working perfectly for the resource files
PlaySound(SoundID);
//PlaySound method is already defined
    }
  }
  super.onActivityResult(requestCode, resultCode, data);
}
//end of code

但它不起作用 现在,在OnActivityResult中,我没有得到如何加载用户选择的文件的正确URI,因为在Android 4.4之前,它返回不同的URI,并在Android 4.4之后返回intent.GetData();上的不同URI。现在,我必须做什么?

另外,我知道要播放音频文件,我必须使用SoundPool,我也有代码,实际上它对资源/原始/音频文件工作正常,但是如何从SoundPool加载/播放URI中的文件?

3 个答案:

答案 0 :(得分:3)

onActivityResult()中,进行以下更改:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && data != null)
    {
        String realPath = null;
        Uri uriFromPath = null;

        realPath = getPathForAudio(YourActivity.this, data.getData());
        uriFromPath = Uri.fromFile(new File(realPath)); // use this uriFromPath for further operations
    }
}     

Activity

中添加此方法
public static String getPathForAudio(Context context, Uri uri)
 {
    String result = null;
    Cursor cursor = null;

    try {
        String[] proj = { MediaStore.Audio.Media.DATA };
        cursor = context.getContentResolver().query(uri, proj, null, null, null);
        if (cursor == null) {
            result = uri.getPath();
        } else {
            cursor.moveToFirst();
            int column_index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
            result = cursor.getString(column_index);
            cursor.close();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return result;
}

希望它能完成你的工作。您也可以使用MediaPlayer类播放音频

答案 1 :(得分:0)

如果要选择音频,可以在项目中添加以下代码。

Intent intent_upload = new Intent();
intent_upload.setType("audio/*");
intent_upload.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent_upload,1);

并在同一个Activity中覆盖onActivityResult,如下所示

@Override 
protected void onActivityResult(int requestCode,int resultCode,Intent data){

  if(requestCode == 1){

    if(resultCode == RESULT_OK){

        //the selected audio.
        Uri uri = data.getData(); 
    }
  }
  super.onActivityResult(requestCode, resultCode, data);
}

答案 2 :(得分:0)

尝试获取路径:

 //method to get the file path from uri
    public String getPath(Uri uri) {
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();
        String document_id = cursor.getString(0);
        document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
        cursor.close();

        cursor = getContentResolver().query(
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
        cursor.moveToFirst();
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        cursor.close();

        return path;
    }

然后加载它:

s2 = soundPool.load(YOU_PATH, PRIORITY);