首页 > 解决方案 > 使用服务在音乐播放器中播放歌曲时出错

问题描述

我是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);
    }
}

服务类

    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

标签: androidandroid-studioandroid-music-playerbackground-music

解决方案


推荐阅读