在上下文资源中从Uri加载MediaPlayer

mad*_*ik3 5 android media-player

我的资产目录中有一个音频文件.资产/音频/ dance.mp3.

如果我运行context.getAssets().list("audio"); 它出现了.

但是当我尝试使用MediaPlayer.create(context,uri)时,它总是失败并返回null.

这似乎都不起作用

private void tryLoad(String path,Context context)
{
    Uri uri = Uri.parse(path);
    this.audioPlayer =  MediaPlayer.create(context,uri);
    if (this.audioPlayer == null)
    {
        Log.d(TAG, "loadAudio: audioPlayer is null. current assets"+ uri.toString()) ;
    }
    else
    {
        Log.d(TAG, "loadAudio: WORKED"+ uri.toString()) ;
    }

}
public void loadAudio(Context context)
{
    if (this.audioPlayer != null)
        return;
    if (this.audioFile != null && this.audioFile.length() >0)
    {
        try 
        {
            tryLoad("/dance.mp3",context);
            tryLoad("dance.mp3",context);
            tryLoad("audio/dance.mp3",context);
            tryLoad("/audio/dance.mp3",context);
            tryLoad("assets/audio/dance.mp3",context);
            tryLoad("/assets/audio/dance.mp3",context);
            tryLoad("\\dance.mp3",context);
            tryLoad("dance.mp3",context);
            tryLoad("audio\\dance.mp3",context);
            tryLoad("\\audio\\dance.mp3",context);
            tryLoad("assets\\audio\\dance.mp3",context);
            tryLoad("\\assets\\audio\\dance.mp3",context);
        }   
        catch (Exception e)
        {
            Log.d(TAG, "loadAudio exception: " + e.getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 3

我认为您可以做到这一点,因为MediaPlayer需要一个 URI,并且不可能为资产文件创建 URI。尝试创建一个MediaPlayer对象并使用该方法为其设置数据源MediaPlayer.setDataSource(FileDescriptor)。您可以FileDescriptor使用该AssetManager.openFd()方法获取对象,然后调用AssetFileDescriptor.getFileDescriptor()返回对象的方法。

我还没有尝试过这个解决方案,所以这只是一个想法。但我希望它能奏效。