0

我已经检索了手机上的歌曲,当我点击列表项时,它会切换到下一个活动并播放歌曲。

但是当我回到我的播放列表并再次单击另一首歌曲时,上一首歌曲仍在播放,就像我刚刚单击的歌曲一样。

这是代码Playlist.java

package com.example.padyplayer;

import java.io.IOException;
import java.util.ArrayList;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

 public class Playlist extends Activity implements OnItemClickListener {

ListView tracks_view;
ArrayList<String> songs;
ArrayAdapter<String> songs_items;
//MediaPlayer mediaplayer;
//AudioManager audiomanager;
Cursor cursor;
Uri uri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_playlist);
    tracks_view = (ListView) findViewById(R.id.tracks);
    generate_Playlist();
    songs_items = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, songs);
    //mediaplayer = new MediaPlayer();
    //audiomanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    tracks_view.setAdapter(songs_items);
    tracks_view.setOnItemClickListener(this); 

}

@SuppressWarnings("deprecation")
private void generate_Playlist() {
    // TODO Auto-generated method stub
    uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String projection[] = { android.provider.MediaStore.Audio.Media.DATA,
            android.provider.MediaStore.Audio.Media.TITLE,
            android.provider.MediaStore.Audio.Media.ARTIST,
            android.provider.MediaStore.Audio.Media.ALBUM,
            android.provider.MediaStore.Audio.Media.DURATION };
    cursor=this.managedQuery(uri, projection, null, null, null);
    songs=new ArrayList<String>();
    while(cursor.moveToNext())
    {
        songs.add(cursor.getString(1));
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.playlist, menu);
    return true;
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
    // TODO Auto-generated method stub
    //cursor.moveToPosition(position);
    int index1=position;
    Intent i=new Intent(getApplicationContext(),Controls.class);
    i.putExtra("index", index1);
    startActivity(i);

}

}

这是第二节课Controls.java

package com.example.padyplayer;

import java.io.IOException;
import java.util.ArrayList;

import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Controls extends Activity implements OnClickListener {

TextView song_view,artist_view;
Button play,next,back;
MediaPlayer mediaplayer=new MediaPlayer();
AudioManager audiomanager;
ArrayList<String> songs;
Cursor cursor;
Uri uri;
private int index=0;
//ArrayAdapter<String> song_items;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_controls);
    play=(Button)findViewById(R.id.play);
    next=(Button)findViewById(R.id.next);
    back=(Button)findViewById(R.id.back);
    play.setOnClickListener(this);
    next.setOnClickListener(this);
    back.setOnClickListener(this);
    //mediaplayer=new MediaPlayer();
    audiomanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    getMusic();
    Bundle b=getIntent().getExtras();
    index = b.getInt("index");
    playSong(index);
}




@SuppressWarnings("deprecation")
private void getMusic() {
    // TODO Auto-generated method stub
    uri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String projection[]={android.provider.MediaStore.Audio.Media.DATA,
            android.provider.MediaStore.Audio.Media.TITLE,
            android.provider.MediaStore.Audio.Media.ARTIST,
            android.provider.MediaStore.Audio.Media.ALBUM,
            android.provider.MediaStore.Audio.Media.DURATION};
    cursor=this.managedQuery(uri, projection, null, null,null);
    songs=new ArrayList<String>();
    while (cursor.moveToNext()) {
        songs.add(cursor.getString(1));
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.controls, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.play:
        if(mediaplayer.isPlaying())
        {
            mediaplayer.pause();
            play.setText("play");
        }
        else if(mediaplayer!=null)
        {
            mediaplayer.start();
            play.setText("pause");

        }
        break;
    case R.id.next:
        if(index<(songs.size()-1)){
            index+=1;
            playSong(index);
        }
        else
        {
            index=0;
            playSong(index);
        }
        break;
    case R.id.back:
        if(index>0){
            index-=1;
            playSong(index);
        }
        else
        {
            index=songs.size()-1;
            playSong(index);
        }
        break;


    default:
        break;
    }
    //

}

private void playSong(int index2) {
    // TODO Auto-generated method stub
    cursor.moveToPosition(index2);
    int song_id=cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
    String song_name=cursor.getString(song_id);

    try {
        mediaplayer.reset();
        mediaplayer.setDataSource(song_name);
        mediaplayer.prepare();
        mediaplayer.start();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

自从两天以来,我一直被这个问题困扰。请帮忙。

4

3 回答 3

1

我的建议:使用服务来托管 MediaPlayer,并让您的活动与服务通信以播放和停止歌曲。完成后不要忘记在 MediaPlayer 上调用 release(如果您为下一首歌曲使用新播放器)。

编辑:

Activity 每次打开时都不会是同一个实例,并且每次创建 Activity 的实例时都会创建一个新的 MediaPlayer。在底层,有一个本机对象实际播放音乐,它与 Activity 的生命周期没有本质上的联系,并且您不会在任何地方调用 stop 或 pause,当 Activity 更改时会被调用。您可能会在适当的回调(onPause 或 onDestroy)中停止并释放 MediaPlayer,但这会阻止您连续播放音乐。如果你坚持使用一个Activity来承载MediaPlayer,那么音乐播放就必须完全融入到Activity的生命周期中。当 Activity 发生变化时,需要显式停止并释放其资源。如果你把它放在一个服务中,你就没有这个限制。注意 setNextMediaPlayer 方法),而不会将它们绑定到任何特定的 Activity。

于 2013-10-08T00:07:58.820 回答
1

它会继续播放。当您按下返回按钮时,您需要释放您的媒体播放器对象。在 onPause() 中,释放您的媒体播放器对象,否则它将继续播放。

要实现音乐播放器,可以参考开源代码。参考 VLC 播放器源代码。

于 2017-09-21T08:32:12.127 回答
0

在每次开始播放歌曲之前mMediaPlayer.reset(),您可以每次播放新歌曲或检查媒体播放器是否正在播放,如果播放停止它

于 2015-10-22T03:31:58.140 回答