【问题标题】:Android Mediaplayer play different songs after eachotherAndroid Mediaplayer 依次播放不同的歌曲
【发布时间】:2012-09-13 12:20:33
【问题描述】:

我在旅途中生成 MIDI 文件。我想连续播放这些文件。

我初始化了一个媒体播放器并启动了 song1.mid。然后我用下面的代码来播放song2.mid

// set on completion listener music file
                mediaPlayer
                        .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {

                                String filePath2 = null;
                                File file = null;
                                FileInputStream inputStream = null;

                                //set the filePath
                                try {
                                    filePath2 = getCacheDir() + "/optimuse" + song + ".mid";
                                    file = new File(filePath2);
                                    if (file.exists()) {
                                        inputStream = new FileInputStream(file);
                                        if (inputStream.getFD().valid()) {
                                            System.out.println("Valid!");
                                        }
                                    }
                                } catch (Exception e1) {
                                    e1.printStackTrace();
                                    System.exit(-1);
                                }

                                //set Mediaplayer's datasource
                                if (file.exists()) {
                                    try {
                                        mediaPlayer = new MediaPlayer();
                                        mediaPlayer.setDataSource(inputStream.getFD());
                                        inputStream.close();
                                    } catch (Exception e1) {
                                        e1.printStackTrace();
                                        System.exit(-1);
                                    }

                                    try {
                                        mediaPlayer.prepare();
                                    } catch (IllegalStateException e) {

                                        e.printStackTrace();
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                }

                                //if the player is not running
                                if (!mediaPlayer.isPlaying()) {
                                    //start the player
                                    mediaPlayer.start();
                                    Toast.makeText(MainActivity.this,
                                            "mediaPlayer.start()", Toast.LENGTH_LONG)
                                            .show();
                                }
                            }
                        });                         


                            }
                        });

问题是媒体播放器在歌曲 2 之后停止。但我想让 song3 开始。我可以增加全局变量,好的。但是当第二首歌结束时,onCompletionListener 似乎不起作用。

我想我也应该初始化 MediaPlayer mp 以拥有一个 onCompletionListener 吗?不确定最好的方法是什么。

或者我应该这样做:

new class MediaPlayer implements OnCompletionListener(){
@Override
song++;
//code to start the mediaplayer
}

感谢您为我指明了正确的方向。当我不断启动新的媒体播放器时,我也有点担心效率......

基本上,我想做的是连续播放song1.mid,song2.mid,...,但是文件是在程序中生成的。

编辑 感谢@Gan 的出色帮助。我知道有以下工作代码:

            // set on completion listener music file
            mediaPlayer
                    .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {

                            String filePath2 = null;
                            File file = null;
                            FileInputStream inputStream = null;

                            //set the filePath
                            try {
                                filePath2 = getCacheDir() + "/optimuse" + song + ".mid";
                                file = new File(filePath2);
                                if (file.exists()) {
                                    inputStream = new FileInputStream(file);
                                    if (inputStream.getFD().valid()) {
                                        System.out.println("Valid!");
                                    }
                                }
                            } catch (Exception e1) {
                                e1.printStackTrace();
                                System.exit(-1);
                            }

                            //set Mediaplayer's datasource
                            if (file.exists()) {
                                try {

                                    mp.stop();
                                    mp.reset();
                                    mp.setDataSource(inputStream.getFD());
                                    inputStream.close();
                                } catch (Exception e1) {
                                    e1.printStackTrace();
                                    System.exit(-1);
                                }

                                try {
                                    mp.prepare();
                                } catch (IllegalStateException e) {

                                    e.printStackTrace();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }

                            //if the player is not running
                            if (!mp.isPlaying()) {
                                //start the player
                                mp.start();
                                Toast.makeText(MainActivity.this,
                                        "mp.start()", Toast.LENGTH_LONG)
                                        .show();
                            }


                        }
                    });                         


                        }
                    });

【问题讨论】:

    标签: java android media-player midi


    【解决方案1】:

    将源位置存储在一个数组中,并在源的 onCompletionListener 循环中。像这样(使用相同的媒体播放器实例)

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) 
    {
       if(currentPosition<sourceArray.size())
       {
            mediaPlayer.reset();
           /* load the new source */
           mediaPlayer.setDataSource(sourceArray[position]);
           /* Prepare the mediaplayer */
           mediaPlayer.prepare();
           /* start */
           mediaPlayer.start();
       }
       else
       {
           /* release mediaplayer */
           mediaPlayer.release();
       }
     }
    

    【讨论】:

    • 谢谢,但在第二首歌曲结束后,mediaPlayer 似乎没有进入 oncompletionlistener(至少现在没有这样做)。因为使用当前代码,它应该继续重复 song2.mid,但它没有(我这样做了,哈哈)
    • 我在您的代码中看到您创建了一个新实例并且您没有设置 onCompletionListener。如果您使用新实例,则每次都必须指定 onCompletionListener。
    • 尝试使用同一个实例,效率更高。
    • 这似乎有道理,但我该怎么做呢?如果我删除 @Override public void onCompletion(MediaPlayer mp) { });它不想编译。
    • 你必须重写 onCompletion 方法,因为它是回调方法。只需按照编辑后的代码即可。只需在媒体播放器中加载下一个源文件,准备并启动它。 (我假设您已将源文件位置存储在 soureceArrayposition 中,只是循环遍历数组的计数器)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多