使用服务在音乐播放器中播放歌曲时出错

问题描述

我是 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 (将#修改为@)