首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android直播间音乐App(媒体播放器)出错

Android直播间音乐App(媒体播放器)出错
EN

Stack Overflow用户
提问于 2015-11-01 06:36:08
回答 3查看 2.8K关注 0票数 0

我正在尝试在android studio中制作一个音乐应用程序。我的应用程序运行得很好,除了它有一个小bug。在我的主要活动中,我有一个歌曲列表,这些歌曲是我从resources文件夹中的raw文件夹导入的。我的第二个窗口是一个NowPlaying java文件,我可以在其中暂停、前进和查看歌曲的歌词。

当我播放主活动中的第一首歌曲时,它工作得很好。但是,当我想要播放第二首歌曲时,因为正在播放第一首歌曲,所以第二首歌曲会在第一首歌曲的顶部播放。歌词更新了,搜索栏也更新了,但是两首歌在一起播放。但是,当我暂停第一首歌曲,返回到主要活动并播放第二首歌曲时,这种情况不会发生。

我使用:

代码语言:javascript
复制
if(song != null){
    if(song.isPlaying()){ 
        song.reset(); song = null;   
    }
}

我知道我的NowPlaying.java文件中有一个错误:所以下面是完整的代码:

PS。我只是在一个学习的过程中。

代码语言:javascript
复制
MediaPlayer song = null;
SeekBar seekBar;
Intent intent = getIntent();


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_now_playing);

    seekBar = (SeekBar) findViewById(R.id.seekBar);
    //String selectedSong =  getIntent().getExtras().getString("selectSong");


    selectSong();


    //for pause button
    pauseButton();

    //for songtile
    getSongtitle();

    getSongList();
    getNextButton();
    getPreviousButton();

} // end of onCreate method


/**
 * Method for selecting the song
 * Moves to startSong method
 */
public void selectSong(){


    TextView lyricsBox = (TextView) findViewById(R.id.lyricsBox);
    lyricsBox.setMovementMethod(new ScrollingMovementMethod());
    String nextPlay = intent.getStringExtra("playSong");

    if(song != null){
        if(song.isPlaying()){
            song.reset();
            song = null;
        }
    }

    if (nextPlay.equals("Demons")) {
        song = MediaPlayer.create(this, R.raw.demons);
        lyricsBox.setText(R.string.demonsLyrics);

    } else if (nextPlay.equals("Black Space")) {
        song = MediaPlayer.create(this, R.raw.blankspace);
        lyricsBox.setText(R.string.blankspaceLyrics);

    } else if (nextPlay.equals("Case 420")) {
        song = MediaPlayer.create(this, R.raw.case420);
        lyricsBox.setText(R.string.case420Lyrics);
    }
    else if(nextPlay.equals("Jalma")){
        song = MediaPlayer.create(this, R.raw.jalma);
        lyricsBox.setText(R.string.jalmaLyrics);
    }
    else if(nextPlay.equals("Parelima")){
        song = MediaPlayer.create(this, R.raw.parelima);
        lyricsBox.setText(R.string.parelimaLyrics);
    }

    else if(nextPlay.equals("Mero Balyakal Ko Sathi")){
        song = MediaPlayer.create(this, R.raw.balyakalsathi);
        lyricsBox.setText(R.string.balyakalSathi);
    }

    else if(nextPlay.equals("Euta Sathi")){
        song = MediaPlayer.create(this, R.raw.eutasathi);

    }
    else if(nextPlay.equals("Audai Jadai")){
        song = MediaPlayer.create(this, R.raw.audaijadai);

    }
    else if(nextPlay.equals("Cheerleader")){
        song = MediaPlayer.create(this, R.raw.cheerleader);

    }



    // to start playing the song
    startButton();
}



//method to make sure seekbar updates till song ends
Runnable run = new Runnable() {
    @Override
    public void run() {
        getseekBar();
    }
};

/**
 * Method to start song (play the song)
 *
 */
public void startButton() {
        song.start();
    //to update seek bar
    getseekBar();
}




/**
 * Method to update the seekbar.
 * implement touch in seekbar to change song position
 */
public void getseekBar() {
    seekBar.setMax(song.getDuration());
    seekBar.setProgress(song.getCurrentPosition());
    seekBar.postDelayed(run, 1000);

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        int seek_to;
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
             seek_to = progress;

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            song.seekTo(seek_to);
        }
    });
}


/**
 * Method for pause Button
 * to pause song once clicked and change button background to play image
 * Again play the song if the button is pressed again. and change background back to pause image
 */
public void pauseButton(){
    final Button playButton = (Button) findViewById(R.id.playButton);

    playButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (song.isPlaying()) {
                playButton.setBackgroundResource(R.drawable.playbutton);
                song.pause();

            } else {
                playButton.setBackgroundResource(R.drawable.pausebutton);
                song.start();

            }

        }
    });
}

/**
 * Method to get the song title from first java file and display in the title
 */
public void getSongtitle(){

    Intent intent = getIntent();
    String nextPlay = intent.getStringExtra("playSong");
    TextView Songtitle = (TextView) findViewById(R.id.Songtitle);
    Songtitle.setText(nextPlay);
}

/**
 * Method for song list button
 * Goes back to the first java file once the button is cliked,
 * displays the song list
 */

public void getSongList(){

    Button lyricsButton = (Button) findViewById(R.id.lyricsButton);
    lyricsButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(NowPlaying.this, MainActivity.class));
        }
    });

}

/**
 * Method for next button
 * the song skips every 10 seconds once clicked
 */

public void getNextButton(){

    Button nextButton = (Button) findViewById(R.id.nextButton);
    nextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int startTime = song.getCurrentPosition();
            int forwardTime = 10000;
            startTime += forwardTime;
            if(startTime <= song.getDuration()){

                song.seekTo(startTime);
            }

            else{
                song.stop();

            }


        }
    });

} // end of getNextButton


/**
 * Method for previous button
 * the song skips back 10 seconds once clicked
 */
public void getPreviousButton(){

    Button previousButton = (Button) findViewById(R.id.previousButton);
    previousButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int startTime = song.getCurrentPosition();
            int previousTime = 10000;
            startTime -= previousTime;

            if(startTime >= 0){
                song.seekTo(startTime);
            }
           else{
               song.seekTo(0);
                song.start();
            }
        }
    });
}

主要活动的代码:

公共类MainActivity扩展了AppCompatActivity {

代码语言:javascript
复制
 String[] songList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    populateList();
}

private void populateList(){
     songList = new String[] {"Jalma", "Demons", "Parelima", "Mero Balyakal Ko Sathi", "Audai Jadai",
             "Case 420", "Euta Sathi", "Cheerleader"};

    ListAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
            songList);

    ListView theList = (ListView) findViewById(R.id.theList);
    theList.setAdapter(arrayAdapter);

    theList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView theList = (ListView) findViewById(R.id.theList);
            startActivity(new Intent(MainActivity.this, NowPlaying.class));
           String selectedSong = (String) (theList.getItemAtPosition(position));

            Intent toSecondActivity = new Intent(getApplicationContext(), NowPlaying.class);

            toSecondActivity.putExtra("playSong", selectedSong);
            startActivity(toSecondActivity);

        }
    });


}

}

EN

回答 3

Stack Overflow用户

发布于 2019-05-06 22:23:28

代码语言:javascript
复制
protected void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_now_playing);
    .......

    @Override
    public void onDestroy(){
       if(song.isplaying())
       {
          song.pause();
          song.release();
       }
       super.onDestroy();
    }
}

您没有销毁此活动的实例,当您暂停歌曲后,它将仅以该活动开始,因此请确保您销毁了此活动的实例,请遵循this tutorial

票数 2
EN

Stack Overflow用户

发布于 2015-11-01 08:04:21

如果没有MainActivity类,我不能确定,但似乎您在NowPlaying中使用的不是相同的MediaPlayer实例,所以我只能假设您已经为这两个活动创建了一个新实例。

这可能意味着原始实例在第一个活动中仍处于活动状态。

如果是这样,您可以在切换活动之前销毁MediaPlayer的MainActivity实例,或者跨两个活动使用相同的实例。

我会推荐第二个选项,如果你只想一次播放一首歌,这是有意义的,然后看看Singleton类。我相信这在这种情况下会工作得很好。

http://www.javaworld.com/article/2073352/core-java/simply-singleton.html

编辑:

试一试,

代码语言:javascript
复制
theList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String selectedSong = (String) (theList.getItemAtPosition(position));

        Intent toSecondActivity = new Intent(MainActivity.this, NowPlaying.class);
        toSecondActivity.putExtra("playSong", selectedSong);
        startActivity(toSecondActivity);

    }
});

并且您需要将theList作为最终版本

票数 0
EN

Stack Overflow用户

发布于 2018-02-26 19:35:43

代码语言:javascript
复制
I am also facing the same issue.Songs are playing on top of each other. Finally I found the answer from a video.
https://www.youtube.com/watch?v=4DC4XFWVFls


//For Play Button OnClick Listener

public void onClick(View v) {

                if(mediaPlayer !=null)
                {
                    mediaPlayer.release();
                }
                mediaPlayer = MediaPlayer.create(context, songList.getSong());
                mediaPlayer.start();
}

//For Stop Button

 public void onClick(View v) {
                mediaPlayer.stop();
            }

This code worked properly for me.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33457359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档