【问题标题】:load a MediaPlayer from a Uri in a context assets从上下文资产中的 Uri 加载 MediaPlayer
【发布时间】:2011-08-18 02:00:39
【问题描述】:

我的资产目录中有一个音频文件。资产/音频/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());
        }
    }
}

【问题讨论】:

    标签: android media-player


    【解决方案1】:

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

    我没有尝试过这个解决方案,所以这只是一个想法。但我希望它会起作用。

    【讨论】:

    • 哎呀.. 无论如何都没有看到你的答案(只是编辑了一个旧答案)-+1 更快:)
    • @madmik3 嗨,如果你认为这个答案是正确的,你可以奖励这个答案。否则你的赏金可能会丢失,因为当你接受答案时它不会自动奖励。
    【解决方案2】:

    我问过类似的问题,看看这个帖子MediaPlayer issue between raw folder and sdcard on android。希望对你有帮助

    【讨论】:

      【解决方案3】:

      您需要将文件放在res/raw 文件夹中,然后使用:

      MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);

      发件人:Android documentation

      【讨论】:

      • 要求他们的文件是硬编码的,这就是我想要避免的。
      • 抱歉,这在您最初的问题中并不清楚。你有没有试过这个:mp = new MediaPlayer(); AssetFileDescriptor afd = getAssets().openFd("dance.mp3"); mp.setDataSource(afd.getFileDescriptor());
      【解决方案4】:

      你不能调用 mp.setDataSource(afd.getFileDescriptor());在资产文件上,因为它将播放所有资产。而是遵循此线程中的解决方案: Play audio file from the assets directory

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2011-06-16
        • 2012-03-11
        • 1970-01-01
        • 2017-06-06
        相关资源
        最近更新 更多