【问题标题】:Android How to Load an Audio file from the sdcard/file manager and play itAndroid 如何从 sdcard/文件管理器加载音频文件并播放
【发布时间】:2017-02-08 10:46:15
【问题描述】:

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

所以,我知道为此,我必须使用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 之后,它在 @987654326 上返回不同的 URI @。现在,我该怎么办?

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

【问题讨论】:

  • 你能把代码贴出来吗,你在OnActivityResult做了什么?你是怎么得到URI的?
  • @Prathamesh Toradmal 编写了代码

标签: android audio android-intent uri action


【解决方案1】:

在您的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 类播放音频

【讨论】:

  • 您好亲爱的朋友,非常感谢,现在我可以获取文件的正确路径,但仍然无法通过 SoundPool.Load 方法加载声音。我试过手动给这个方法提供文件名,但它不起作用,我认为方法本身有问题:SoundPool.Load(string path, int priority) 你能帮忙吗?
  • 嗨,我刚刚对 MediaPlayer 类进行了同样的尝试,它正在使用它。无法理解为什么它不能在 SoundPool 中工作。有什么想法吗?
  • 我对 SoundPool 也没有信心,因为我从未使用过它。这就是我向您推荐 MediaPlayer 的原因。不得不研究一下SoundPool。 :) 如果我找到什么我会告诉你的。
  • 嗨 Prathamesh Toradmal,好的,兄弟。如果你发现了什么,请告诉我。实际上,我不能使用 mediaplayer 类,因为我需要响应非常灵敏的声音回放来实现某些特殊目的。 :(现在我被卡住了
  • 您好@AkashKakkar,我认为 SoundPool 无法播放 SD 卡中的音频。如果音频位于原始文件夹中,您可以播放音频。供您参考,请查看此链接:stackoverflow.com/questions/9528238/…
【解决方案2】:

当你想选择音频时,你可以在你的项目中添加以下代码。

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);
}

【讨论】:

  • 我已经尝试过这种方法,但是这段代码不起作用。首先,每个应用程序都返回不同的 URI,其次,SoundPool.Load 方法不接受任何 URI 并且不加载声音
【解决方案3】:

尝试获取路径:

 //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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多