Android - Mediaplayer下一个按钮不起作用

时间:2017-09-01 10:27:44

标签: java android

我正在开发直播电台Android应用程序...我有一个包含4个音轨的阵列,当我到达列表的末尾时,假设下一个按钮代表"最后一首歌#34;但它并没有崩溃应用程序。

这是按钮代码:

    counter=0;

    mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v) {
             if (counter < songurl.length) {
                 counter = counter + 1;
                 textview.setText(songurl[counter]);
                 try {
                     mediaPlayer.reset();
                 } catch (Exception ex) {
                     try {
                         mediaPlayer.setDataSource(songurl[counter]);
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     try {
                         mediaPlayer.prepare();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     mediaPlayer.start();
                 }
             } else {

                 Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
             }
         }
    });

还有一个问题......如果我想在应用程序到达最后一首歌时让它成为一个闭环,我想按下一步从头开始列表我该怎么做? 感谢。

4 个答案:

答案 0 :(得分:3)

您只需在代码中添加模数(%)运算符

即可

counter = counter++ % songurl.length

无需添加额外的if else块

btn_next.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        counter = counter++ % songurl.length
        textview.setText(songurl[counter]);
        try {
            mediaPlayer.reset();
        } catch (Exception ex) {
            try {
                mediaPlayer.setDataSource(songurl[counter]);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mediaPlayer.start();
        }

    }
});

答案 1 :(得分:0)

你遇到的一个问题就是你在检查它是否在界限内之后递增计数器,这意味着你的安全检查是无用的。将counter = counter + 1;移到if语句的末尾。

就连续循环而言,您可以在if语句体的末尾将其更改为counter = (counter + 1) % songurl.length;

除了您提出的问题的范围之外,使用MediaPlayer时存在一些问题。在catch语句中拥有如此多的关键逻辑并没有任何意义。这意味着您希望异常发生。你应该重新思考你在那里做了什么。

答案 2 :(得分:0)

你看到你在catch块中调用了mediaPlayer.setDataSource(songurl [counter])。 如果调用mediaPlayer.reset()

时它不会有异常怎么办?

试试这个:

try{
    mediaPlayer.reset();
    mediaPlayer.setDataSource();
    mediaPlayer.prepareAsync();--or mediaPlayer.prepare();
    (It depends on whether you load the url on the internet)
    mediaPlayer.start(); -- if you call mediaPlayer.prepareAsync() you should call mediaPlayer.start() at the OnPreparedListener;

 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
}

如果你仍然想知道,我建议你阅读有关MediaPlay状态的一些内容。

PS如果正在播放mediaPlayer,并且您想让它播放另一个,请先调用mediaPlayer.stop();

答案 3 :(得分:-1)

要制作循环,您应该在onclicklistener中检查if计数器是否等于songurl.length,这是我认为播放列表中歌曲的总数。

int counter=0;

    MediaPlayer mediaPlayer=new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    btn_next.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (counter < songurl.length) {
                counter = counter + 1;
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            } else if(counter == songurl.length) {

                counter = 0;
               // Toast.makeText(MainActivity.this, "last song", Toast.LENGTH_SHORT).show();
                textview.setText(songurl[counter]);
                try {
                    mediaPlayer.reset();
                } catch (Exception ex) {
                    try {
                        mediaPlayer.setDataSource(songurl[counter]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        mediaPlayer.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    mediaPlayer.start();
                }
            }
        }
    });

在elseif条件下我将计数器设置为0.这样它就会进入循环。