0

你好我已經實現音樂服務的代碼我想創建音樂播放器的演示,但它不會從onCreate()自動啓動我想在活動打開時自動啓動播放器。在這裏下面我把活動和服務的代碼,請幫助我的任何幫助將不勝感激。Android音樂播放器不能從onCreate自動啓動

public class MainActivity extends Activity { 
    private ArrayList<Song> songList; 
    private ListView songView; 
    private MusicService musicSrv; 
    private Intent playIntent; 
    private boolean musicBound = false; 
    private MusicController controller; 
    private boolean paused = false, playbackPaused = false; 
    private ServiceConnection musicConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      MusicService.MusicBinder binder = (MusicService.MusicBinder) service; 
      musicSrv = binder.getService(); 
      musicSrv.setList(songList); 
      musicBound = true; 
     } 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      musicBound = false; 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     songView = (ListView) findViewById(R.id.song_list); 
     songList = new ArrayList<Song>(); 
     getSongList(); 
     Collections.sort(songList, new Comparator<Song>() { 
      public int compare(Song a, Song b) { 
       return a.getTitle().compareTo(b.getTitle()); 
      } 
     }); 
     SongAdapter songAdt = new SongAdapter(this, songList); 
     songView.setAdapter(songAdt); 
songPicked(); 
    } 
    @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 void songPicked() { 
     musicSrv.setSong(0); 
     musicSrv.playSong(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     paused = true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (paused) { 
      paused = false; 
     } 
    } 

    @Override 
    protected void onStop() { 
     controller.hide(); 
     super.onStop(); 
    } 

    @Override 
    protected void onDestroy() { 
     stopService(playIntent); 
     musicSrv = null; 
     super.onDestroy(); 
    } 
} 

在這裏下面我把服務代碼也。

public class MusicService extends Service implements 
     MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, 
     MediaPlayer.OnCompletionListener { 

    private final IBinder musicBind = new MusicBinder(); 
    private MediaPlayer player; 
    private ArrayList<Song> songs; 
    private int songPosn; 
    private String songTitle = ""; 
    private Random rand; 

    public void onCreate() { 
     super.onCreate(); 
     songPosn = 0; 
     rand = new Random(); 
     player = new MediaPlayer(); 
     initMusicPlayer(); 
    } 

    public void initMusicPlayer() { 
     player.setWakeMode(getApplicationContext(), 
       PowerManager.PARTIAL_WAKE_LOCK); 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setOnPreparedListener(this); 
     player.setOnCompletionListener(this); 
     player.setOnErrorListener(this); 
    } 

    public void setList(ArrayList<Song> theSongs) { 
     songs = theSongs; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return musicBind; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     player.stop(); 
     player.release(); 
     return false; 
    } 

    public void playSong() { 
     player.reset(); 
     Song playSong = songs.get(0); 
     songTitle = playSong.getTitle(); 
     long currSong = playSong.getID(); 
     Uri trackUri = ContentUris.withAppendedId(
       android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       currSong); 
     try { 
      player.setDataSource(getApplicationContext(), trackUri); 
     } catch (Exception e) { 
      Log.e("MUSIC SERVICE", "Error setting data source", e); 
     } 
     try { 
      player.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void setSong(int songIndex) { 
     songPosn = songIndex; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     if (player.getCurrentPosition() > 0) { 
      mp.reset(); 
     } 
    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     mp.reset(); 
     return false; 
    } 

    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
     playSong(); 
    } 

    @Override 
    public void onDestroy() { 
     stopForeground(true); 
    } 

    public class MusicBinder extends Binder { 
     MusicService getService() { 
      return MusicService.this; 
     } 
    } 
} 

我只想在應用程序自動啓動而沒有任何點擊的情況下啓動播放器。但不幸的是,它顯示停止與媒體播放器的空對象引用。我從來沒有在音樂播放器上使用過服務。

空指針異常拋出,因爲音樂服務對象返回null。

+0

的【什麼是一個NullPointerException,如何解決呢?(可能的複製https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do- i-fix-it) –

+0

你還必須提供一個崩潰日誌 –

+0

@VladMatvienko它只是因爲音樂服務對象是null,它是從musicConnection方法創建的,所以 –

回答

0

最後根據@vladMatvienko解答謝謝你的支持人。

private ServiceConnection musicConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      MusicService.MusicBinder binder = (MusicService.MusicBinder) service; 
      musicSrv = binder.getService(); 
      musicSrv.setList(songList); 
      musicBound = true; 
songPicked(); 
     } 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      musicBound = false; 
     } 
    };