在MediaPlayer-android中创建()失败

在MediaPlayer-android中创建()失败,android,callback,media-player,Android,Callback,Media Player,我试图播放一些基于按钮点击的音乐(wav格式)文件。我无法让MediaPlayer正常工作。每次我尝试实例化MediaPlayer类的对象时,它都会在create()上失败。在我发布代码之前,这里是我正在做的一个演示: 1.包含两个按钮的布局文件。 2.这些按钮是为它们定义的读取和onClickListeners。 3.根据单击的按钮,将调用一个名为playAudioFile(View)的函数,该函数创建MediaPlayer实例并播放该文件。playAudioFile(视图)的代码如下:

我试图播放一些基于按钮点击的音乐(wav格式)文件。我无法让MediaPlayer正常工作。每次我尝试实例化MediaPlayer类的对象时,它都会在create()上失败。在我发布代码之前,这里是我正在做的一个演示:
1.包含两个按钮的布局文件。
2.这些按钮是为它们定义的读取和onClickListeners。
3.根据单击的按钮,将调用一个名为
playAudioFile(View)
的函数,该函数创建MediaPlayer实例并播放该文件。playAudioFile(视图)的代码如下:

   public void playAudioFile(View v) {
        /*Steps:
         * 1. Take in id of the button.
         * 2. Using id, identify what file needs to be played.
         * 3. Play file.
         */

        String path_to_file = null;   //this is the path to the file.

        if(b01.getId() == ((Button)v).getId()) {
            Log.v(this.toString(), "Button 01 pressed.");
            path_to_file = "/sdcard/audio/temp1.wav";
        } else if(b02.getId() == ((Button)v).getId()) {
            Log.v(this.toString(), "Button02 pressed.");
            path_to_file = "/sdcard/audio/temp2.wav";
        }
        path_to_file = "file://" + path_to_file;
        Uri streamUri = Uri.parse(path_to_file);
        Log.v(this.toString(), "Path of file = " + path_to_file);
        MediaPlayer mp = MediaPlayer.create(this, streamUri);

        if(mp == null) {
            Log.v(this.toString(), "Create() on MediaPlayer failed.");
        }

        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                // TODO Auto-generated method stub
                try {
                    mp.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                    Log.v(this.toString(), "Illegal state exception thrown in start.");
                }
            }
        });

        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mp.release();
            }
        });
    }
我已经阅读了很多关于stackoverflow的帖子,详细介绍了上述问题的解决方案。我在综合了其中提出的所有建议后,遇到了这个问题。欢迎任何帮助

谢谢,

斯利拉姆我不明白你为什么要这么做

MediaPlayer mp = MediaPlayer.create(this, streamUri);
这是我对我的播放器的实现,希望这能在某种程度上帮助您:

MediaPlayer mp = new MediaPlayer();

        setContentView(R.layout.player);

        Intent intent = getIntent();

        String path = "";

        System.out.println("My Scheme : "+intent.getData().toString().substring(8));

        if (intent.getData().getScheme().equals("video")) {

            path = intent.getData().toString().substring(8);
            System.out.println("Path : "+path);

            if(path.endsWith(".mp3")) {
            setContentView(R.layout.musicplayer);
            setContentView(R.layout.controls);

                Log.e("MusicPlayer", "Playing: " + path);
                try {

                    Notification notification = new Notification(
                            R.drawable.playbackstart, path, System.currentTimeMillis());
                    nm.notify(NOTIFY_ID, notification);

                    mp.reset();
                    mp.setDataSource(path);
                    mp.prepare();
                    mp.start(); 
                    mp.setOnCompletionListener(new OnCompletionListener() {

                        public void onCompletion(MediaPlayer arg0) {
                            System.out.println("Hi i am at the End");

                        }
                    });
                }catch {expression}

我不明白你为什么要这么做

MediaPlayer mp = MediaPlayer.create(this, streamUri);
这是我对我的播放器的实现,希望这能在某种程度上帮助您:

MediaPlayer mp = new MediaPlayer();

        setContentView(R.layout.player);

        Intent intent = getIntent();

        String path = "";

        System.out.println("My Scheme : "+intent.getData().toString().substring(8));

        if (intent.getData().getScheme().equals("video")) {

            path = intent.getData().toString().substring(8);
            System.out.println("Path : "+path);

            if(path.endsWith(".mp3")) {
            setContentView(R.layout.musicplayer);
            setContentView(R.layout.controls);

                Log.e("MusicPlayer", "Playing: " + path);
                try {

                    Notification notification = new Notification(
                            R.drawable.playbackstart, path, System.currentTimeMillis());
                    nm.notify(NOTIFY_ID, notification);

                    mp.reset();
                    mp.setDataSource(path);
                    mp.prepare();
                    mp.start(); 
                    mp.setOnCompletionListener(new OnCompletionListener() {

                        public void onCompletion(MediaPlayer arg0) {
                            System.out.println("Hi i am at the End");

                        }
                    });
                }catch {expression}

如果我没记错的话,就不能使用onPrepare,因为在MediaPlayer.create()中调用了mp.prepare()。最简单的代码可以是这样的:

MediaPlayer mp = MediaPlayer.create(this, streamUri);
mp.start();
如果您想要更详细的内容,可以尝试以下方法:

MediaPlayer mp = MediaPlayer.create(this, streamUri);        
if(mp == null) {            
    Log.v(this.toString(), "Create() on MediaPlayer failed.");       
} else {
    mp.setOnCompletionListener(new OnCompletionListener() {

    @Override
      public void onCompletion(MediaPlayer mp) {
          //here you should call the methods to release memory
          mp.stop();
          mp.release();
      }
    });
    mp.start();

}
告诉我这是否对你有帮助


PD:如果您使用设备进行测试,而不是使用模拟器,效果会更好。有些类在那里不能正常工作(MediaPlayer无法在模拟器中复制视频),我不记得它是否支持音频。

如果我没有错,您不能使用onPrepare,因为在MediaPlayer.create()中调用了mp.prepare()。最简单的代码可以是这样的:

MediaPlayer mp = MediaPlayer.create(this, streamUri);
mp.start();
如果您想要更详细的内容,可以尝试以下方法:

MediaPlayer mp = MediaPlayer.create(this, streamUri);        
if(mp == null) {            
    Log.v(this.toString(), "Create() on MediaPlayer failed.");       
} else {
    mp.setOnCompletionListener(new OnCompletionListener() {

    @Override
      public void onCompletion(MediaPlayer mp) {
          //here you should call the methods to release memory
          mp.stop();
          mp.release();
      }
    });
    mp.start();

}
告诉我这是否对你有帮助


PD:如果您使用设备进行测试,而不是使用模拟器,效果会更好。有些类在那里不能正常工作(MediaPlayer无法在模拟器中复制视频),我不记得它是否支持音频。

据我所知,您正在调用
MediaPlayer.create(…)
方法,它返回
null
,这意味着创建
MediaPlayer实例失败。根据这篇文章的公认答案,这是由于一个
损坏的音频文件


我也有一个问题,声音被播放,但在极少数情况下create()方法也返回null。我在回合制游戏中使用声音,每次回合后都会播放声音。我总是调用create方法,启动播放器并在完成后释放它。这种情况每转一圈都会发生,就像每300转一圈一样,create方法返回null。。。所以在我的情况下,它一定是别的东西。在您的中,它可能与mp3文件的损坏有关。

据我所知,您的问题是:您正在调用
MediaPlayer.create(…)
方法,它返回
null
,这意味着创建
MediaPlayer实例失败。根据这篇文章的公认答案,这是由于一个
损坏的音频文件



我也有一个问题,声音被播放,但在极少数情况下create()方法也返回null。我在回合制游戏中使用声音,每次回合后都会播放声音。我总是调用create方法,启动播放器并在完成后释放它。这种情况每转一圈都会发生,就像每300转一圈一样,create方法返回null。。。所以在我的情况下,它一定是别的东西。在您的中,这可能与mp3文件的损坏有关。

我认为您之前添加了额外的\filepath@chirag:如果我在文件路径之前添加了一个额外的\项,那么mediaplayer是否应该在setDataSource()上没有失败?为什么在prepare()上?我会试试你的建议。@chirag:不,在文件路径之前删除“\”不会改变任何东西。谢谢这些评论能解决你的问题吗?@gian1200:不太能。。我不知道是什么问题。。但是我重新启动计算机的那一刻,一切都准备就绪了。我想你在添加额外的\之前filepath@chirag:如果我在文件路径之前添加了一个额外的\项,那么mediaplayer是否应该在setDataSource()上没有失败?为什么在prepare()上?我会试试你的建议。@chirag:不,在文件路径之前删除“\”不会改变任何东西。谢谢这些评论能解决你的问题吗?@gian1200:不太能。。我不知道是什么问题。。但是我重新启动电脑的那一刻,一切都准备就绪。@Sen:我有wav文件要播放,不是mp3。MediaPlayer也可以播放wav文件吗?@Sen:我之所以使用create()是因为文档本身这么说。链接:@Sriram:\u MediaPlayer也可以播放wav文件吗?是的请参考@Sriram:您是否尝试过我的实现。它也可以做你想做的事情。@Sen:我试过上面的代码。它在prepare()上失败。这也是我切换到create()的原因。我还缺什么吗?@Sen:我有wav文件要播放,不是mp3。MediaPlayer也可以播放wav文件吗?@Sen:我之所以使用create()是因为文档本身这么说。链接:@Sriram:\u MediaPlayer也可以播放wav文件吗?是的请参考@Sriram:您是否尝试过我的实现。它也可以做你想做的事情。@Sen:我试过上面的代码。它在prepare()上失败。这也是我切换到create()的原因。我还遗漏了什么吗?嘿,谢谢你的回答。我试过你在后台服务中说的话,但我在日志中看到这样一条消息:
“在MediaPlayer上创建()失败。”
这意味着它仍然为空,那么我如何修复它?你的streamUri是什么?这是我的音乐流:音乐流我正在后台播放音乐嘿,谢谢你的回答。我试过你在后台服务中说的话,但我在日志中得到了这样一条信息: