问题描述
我是 android 新手。尝试创建一个具有两个活动的音乐播放器。当我将没有服务的媒体文件传递给播放的播放器活动歌曲时。当我尝试使用服务进行播放时,它第一次播放并自动退出并出现一些错误。在下面添加我的代码。任何帮助表示赞赏。
谢谢,
主要活动
SongAdapter songAdapter = new SongAdapter(MainActivity.this,songList);
songView.setAdapter(songAdapter);
songView.setonItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
openService(view,position);
}
});
private void openService(View view,int position) {
musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
// musicSrv.setSong(position);
musicSrv.playSong();
Intent i=new Intent(MainActivity.this,PlayerActive.class);
i.putExtra("SONG_KEY",songList);
i.putExtra("position",position);
// String songName= songList.get(position).getPath();
//
// i.putExtra("SONG_KEY",songList);
startActivity(i);
}
//connect to the service
private ServiceConnection musicConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name,IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder)service;
//get service
musicSrv = binder.getService();
//pass list
musicSrv.setList(songList);
musicBound = true;
}
@Override
public void onServicedisconnected(ComponentName name) {
musicBound = false;
}
};
@Override
protected void onStart() {
super.onStart();
if(playIntent==null){
playIntent = new Intent(this,MusicService.class);
bindService(playIntent,musicConnection,Context.BIND_AUTO_CREATE);
startService(playIntent);
}
}
Service.class
public class MusicService extends Service implements
MediaPlayer.OnPreparedListener,MediaPlayer.OnErrorListener,MediaPlayer.OnCompletionListener{
// MainActivity mainFrame = new MainActivity();
// PlayerActive mActivity = new PlayerActive();
// Context context;
//media player
private MediaPlayer player=new MediaPlayer();
//song list
private ArrayList<Song> songs = new ArrayList<>();
//current position
private int songPosn;
Song playSong=new Song();
private final IBinder musicBind = new MusicBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return musicBind;
}
@Override
public boolean onUnbind(Intent intent){
player.stop();
player.release();
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
mp.setLooping(true);
}
@Override
public boolean onError(MediaPlayer mp,int what,int extra) {
return false;
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
public void musicPause(){
if(player.isPlaying()){
player.setLooping(true);
}
}
public void setSong(int songIndex){
songPosn=songIndex;
}
// @Override
// public void onDestroy() {
// super.onDestroy();
//
// player.stop();
// }
public void onCreate(){
//create the service
super.onCreate();
//initialize position
songPosn=0;
//create player
player = new MediaPlayer();
initMusicPlayer();
}
public void initMusicPlayer(){
//set player properties
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setonPreparedListener(this);
player.setonCompletionListener(this);
player.setonErrorListener(this);
}
public void setList(ArrayList<Song> theSongs){
songs=theSongs;
}
public class MusicBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
public void playSong(){
if(player !=null && player.isPlaying()) {
player.release();
}
//get song
playSong=songs.get(songPosn);
//get id
long currSong = playSong.getID();
String name= songs.get(songPosn).getTitle();
//set uri
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,currSong);
Log.e("Player :"+player,"Bruhh........");
try{
player.setDataSource(getApplicationContext(),trackUri);
Log.e("Player :"+player,"Bruhh........");
}
catch(Exception e){
Log.e("MUSIC SERVICE","Error setting data source",e);
}
player.prepareAsync();
}
public int getPosn(){
return player.getCurrentPosition();
}
public int getDur(){
return player.getDuration();
}
public boolean isPng(){
return player.isPlaying();
}
public void pausePlayer(){
player.pause();
}
public void seek(int posn){
player.seekTo(posn);
}
public void go(){
player.start();
}
public void playPrev(){
songPosn--;
if(songPosn>0) songPosn=songs.size()-1;
// playSong();
}
//skip to next
public void playNext(){
songPosn++;
if(songPosn<=songs.size()) songPosn=0;
// playSong();
}
}
在 PlayerActivity 中添加了服务连接(自己尝试过)
E/Player :android.media.MediaPlayer@d1538b: Bruhh........
E/MUSIC SERVICE: Error setting data source
java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1296)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1279)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1261)
at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1155)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1112)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1019)
at com.sample.mark9.MusicService.playSong(MusicService.java:192)
at com.sample.mark9.MainActivity.openService(MainActivity.java:125)
at com.sample.mark9.MainActivity.access$000(MainActivity.java:45)
at com.sample.mark9.MainActivity$2.onItemClick(MainActivity.java:90)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1219)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3230)
at android.widget.AbsListView$3.run(AbsListView.java:4186)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:221)
at android.app.ActivityThread.main(ActivityThread.java:7542)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sample.mark9,PID: 28344
java.lang.IllegalStateException
at android.media.MediaPlayer.prepareAsync(Native Method)
at com.sample.mark9.MusicService.playSong(MusicService.java:202)
at com.sample.mark9.MainActivity.openService(MainActivity.java:125)
at com.sample.mark9.MainActivity.access$000(MainActivity.java:45)
at com.sample.mark9.MainActivity$2.onItemClick(MainActivity.java:90)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1219)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3230)
at android.widget.AbsListView$3.run(AbsListView.java:4186)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:221)
at android.app.ActivityThread.main(ActivityThread.java:7542)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
I/Process: Sending signal. PID: 28344 SIG: 9
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)