2017-02-22 3 views
0

プレイヤーがサービスを受けていて、別のプレイリストを再生したいブロードキャストが使用されていても正しく動作していないため、適切に更新してください。サービスがバックグラウンドで実行されている場合、Mediaplayerを再起動して新しいプレイリストを再生する方法

if (mApp.ismIsServiceRunning() == true) { 
       mApp.getService().mediaPlayer.stop(); 

       new StorageUtil(getApplicationContext()).clearCachedAudioPlaylist(); 

       track_title.setText(trackArrayList.get(0).getTrk_title()); 
       art_name.setText(trackArrayList.get(0).getArt_name()); 
       track_id = trackArrayList.get(0).getTrk_id(); 


       if (trackArrayList.get(0).getFavourite_status().equals("false")) { 
        favrit.setImageResource(R.mipmap.fav); 
       } else { 
        favrit.setImageResource(R.mipmap.fav_fill); 
       } 

       StorageUtil storage = new StorageUtil(getApplicationContext()); 
       storage.storeAudio(trackArrayList); 
       storage.storeAudioIndex(0); 

       Intent broadcastIntent = new Intent(Broadcast_PLAY_NEW_AUDIO); 
       sendBroadcast(broadcastIntent); 
} 

私のサービスは、私は私の本の中でバックグラウンドミュージックサービスプロジェクトを実施し、この

public class MediaPlayerService extends Service implements MediaPlayer.OnPreparedListener{ 

    public MediaPlayer mediaPlayer; 


    // Binder given to clients 
    private final IBinder iBinder = new LocalBinder(); 

    //List of available Audio files 
    private ArrayList<Track> audioList; 
    private int audioIndex = -1; 
    private Track activeAudio; //an object on the currently playing audio 


    //Handle incoming phone calls 
    private boolean ongoingCall = false; 
    private PhoneStateListener phoneStateListener; 
    private TelephonyManager telephonyManager; 


    /** 
    * Service lifecycle methods 
    */ 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     register_playNewAudio(); 

    } 

    //The system calls this method when an activity, requests the service be started 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 



     try { 

      //Load data from SharedPreferences 
      StorageUtil storage = new StorageUtil(getApplicationContext()); 
      audioList = storage.loadAudio(); 
      audioIndex = storage.loadAudioIndex(); 


     } catch (NullPointerException e) { 
      stopSelf(); 
     } 

     //Request audio focus 
     if (requestAudioFocus() == false) { 
      //Could not gain focus 
      stopSelf(); 
     } 


     if (mediaSessionManager == null) { 
      try { 
       initMediaSession(); 
       initMediaPlayer(); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
       stopSelf(); 
      } 
     } 

     //Handle Intent action from MediaSession.TransportControls 
     handleIncomingActions(intent); 
     return START_STICKY; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     mediaSession.release(); 
     removeNotification(); 
     return super.onUnbind(intent); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mediaPlayer != null) { 
      stopMedia(); 
      mediaPlayer.release(); 
     } 

     new StorageUtil(getApplicationContext()).clearCachedAudioPlaylist(); 
    } 


    /** 
    * Service Binder 
    */ 
    public class LocalBinder extends Binder { 
     public MediaPlayerService getService() { 
      // Return this instance of LocalService so clients can call public methods 
      return MediaPlayerService.this; 
     } 
    } 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     //Invoked to communicate some info 
     return false; 
    } 

    @Override 
    public void onPrepared(MediaPlayer mp) { 
     //Invoked when the media source is ready for playback. 
     playMedia(); 
    } 

    @Override 
    public void onSeekComplete(MediaPlayer mp) { 
     //Invoked indicating the completion of a seek operation. 
    } 

    /** 
    * MediaPlayer actions 
    */ 
    private void initMediaPlayer() { 
     if (mediaPlayer == null) 
      mediaPlayer = new MediaPlayer();//new MediaPlayer instance 

     //Set up MediaPlayer event listeners 
     mediaPlayer.setOnCompletionListener(this); 
     mediaPlayer.setOnErrorListener(this); 
     mediaPlayer.setOnPreparedListener(this); 
     mediaPlayer.setOnBufferingUpdateListener(this); 
     mediaPlayer.setOnSeekCompleteListener(this); 
     mediaPlayer.setOnInfoListener(this); 
     //Reset so that the MediaPlayer is not pointing to another data source 
     mediaPlayer.reset(); 


     mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     try { 
      // Set the data source to the mediaFile location 
      mediaPlayer.setDataSource(audioList.get(audioIndex).getTrk_audio()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      stopSelf(); 
     } 

     mediaPlayer.prepareAsync(); 
    } 

    private void playMedia() { 
     if (!mediaPlayer.isPlaying()) { 
      mediaPlayer.start(); 
      // mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext); 
      // mLocalBroadcastManager.sendBroadcast(intent_brodcast_seekbar); 
     } 
    } 

    private void stopMedia() { 
     if (mediaPlayer == null) return; 
     if (mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
    } 

    public MediaPlayer getMediaPlayer() { 
     return mediaPlayer; 
    } 



    /** 
    * Play new Audio 
    */ 
    private BroadcastReceiver playNewAudio = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      audioList.clear(); 

      audioList = new StorageUtil(getApplicationContext()).loadAudio(); 
      audioIndex = new StorageUtil(getApplicationContext()).loadAudioIndex(); 
      stopMedia(); 
      mediaPlayer.reset(); 
      initMediaPlayer(); 

     } 
    }; 

    private void register_playNewAudio() { 
     //Register playNewMedia receiver 
     IntentFilter filter = new IntentFilter(PlaylistActivity.Broadcast_PLAY_NEW_AUDIO); 
     registerReceiver(playNewAudio, filter); 
    } 



} 

答えて

0

のようなものです。 ここに私はそれをレイアウトした方法です。私はアプリケーションにサービスをバインドするためのバインディングコードを含めていませんでしたが、正しいと思われます。

最初に、メインコントロールアクティビティには、曲内で60秒間再生、一時停止、早送りができるボタンがあります。これらのボタンハンドラは、MainActivityでこのように見えます。

// Set Button handlers 
((Button)findViewById(R.id.btnStart)).setOnClickListener(btnClick); 
((Button)findViewById(R.id.btnStop)).setOnClickListener(btnClick);  

// Add a long click listener on the Start button which will seek forward 30 seconds 
((Button)findViewById(R.id.btnStop)).setOnLongClickListener(longClick); 

もMainActivityでボタンハンドラ:

private View.OnClickListener btnClick = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.btnStart:{ 
       enableButtons(true); 
       mServ.resumeMusic(); 
       break; 
      } 
      case R.id.btnStop:{ 
       enableButtons(false); 
       mServ.pauseMusic(); 
       break; 
      }    
     } 
    } 
}; 

private View.OnLongClickListener longClick = new View.OnLongClickListener() { 
    @Override 
    public boolean onLongClick(View v) { 
     mServ.forwardMusic(); 
     Toast.makeText(MainActivity.this, "Forwarding 60 seconds", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 
}; 

は、その後のサービスには、それに応じたアクションを実装します。これは助けることができる

public class MusicService extends Service implements MediaPlayer.OnErrorListener{ 

    private final IBinder mBinder = new ServiceBinder(); 
    MediaPlayer mPlayer; 
    private int length = 0; 
    private int seekForwardTime = 60000; 

    public MusicService() { } 

    public class ServiceBinder extends Binder { 
     public MusicService getServiceInstance() { 
      return MusicService.this; 
     } 
    } 

    @Override 
    public IBinder onBind(Intent arg0){return mBinder;} 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mPlayer = MediaPlayer.create(this, R.raw.yoursongname); 
     mPlayer.setOnErrorListener(this); 

     if(mPlayer!= null) { 
      mPlayer.setLooping(false); 
      mPlayer.setVolume(100,100); 
     } 
     mPlayer.setOnErrorListener(new OnErrorListener() { 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       onError(mPlayer, what, extra); 
       return true; 
      } 
     }); 
    } 

    @Override 
    public int onStartCommand (Intent intent, int flags, int startId) { 
     mPlayer.start(); 
     return START_NOT_STICKY; 

    } 

    public void pauseMusic() { 
     if(mPlayer.isPlaying()) { 
      mPlayer.pause(); 
      length=mPlayer.getCurrentPosition();   
     } 
    } 

    public void forwardMusic() { 
     if(mPlayer.isPlaying()) { 
      int currentPosition = mPlayer.getCurrentPosition(); 
      // check if seekForward time is lesser than song duration 
      if (currentPosition + seekForwardTime <= mPlayer.getDuration()) { 
       // forward song 
       mPlayer.seekTo(currentPosition + seekForwardTime); 
      } 
     } 
    } 

    public void resumeMusic() { 
     if(mPlayer.isPlaying()==false) 
     { 
      mPlayer.seekTo(length); 
      mPlayer.start(); 
     } 
    } 

    public void stopMusic() { 
     mPlayer.stop(); 
     mPlayer.release(); 
     mPlayer = null; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if(mPlayer != null) { 
      try { 
       mPlayer.stop(); 
       mPlayer.release(); 
      } finally { 
       mPlayer = null; 
      } 
     } 
    } 

    public boolean onError(MediaPlayer mp, int what, int extra) { 
     Toast.makeText(this, "music player failed", Toast.LENGTH_SHORT).show(); 
     if(mPlayer != null) { 
      try { 
       mPlayer.stop(); 
       mPlayer.release(); 
      } finally { 
       mPlayer = null; 
      } 
     } 
     return false; 
    } 

希望を。マークウィッカム

+0

あなたの答えのためのちょっとWickham thax私はそれを感謝します。しかし、私はまた、あなたが提案を与えることができますサービスを介してメディアプレーヤーの私のseekbarを更新したい。 –

+0

ちょっと甲山さん。高レベルで、私はあなたの活動にあなたのシークバーを実装すると言います。シークバーの左右に「前方にスキップ」と「後方にスキップ」の矢印を追加することもできます。私がforwardMusic()のために与えたコードは、前方の矢印をスキップするために使用できます。後ろにスキップするのと同様に実装できます。ユーザーがシークバーをドラッグできるようにするには、シークバーでonProgressUpdateメソッドを実装し、その位置をサービスに渡します。 –

+0

コメントのためのあなたの貴重な時間のためにちょっとWickhamおかげで、私は次の曲を再生するときに私の曲はスキップして、私はこのようなサービスから私のシークバーを更新しようとすると適切な順序で再生されません。 プライベートvoid playMedia(){ if(!mediaPlayer.isPlaying()){ mediaPlayer.start(); mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext); mLocalBroadcastManager.sendBroadcast(intent_brodcast_seekbar); } } 私が更新用のシークバーを削除した場合、私は適切な曲の順序を維持できます。 –

関連する問題