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);
}
}
あなたの答えのためのちょっとWickham thax私はそれを感謝します。しかし、私はまた、あなたが提案を与えることができますサービスを介してメディアプレーヤーの私のseekbarを更新したい。 –
ちょっと甲山さん。高レベルで、私はあなたの活動にあなたのシークバーを実装すると言います。シークバーの左右に「前方にスキップ」と「後方にスキップ」の矢印を追加することもできます。私がforwardMusic()のために与えたコードは、前方の矢印をスキップするために使用できます。後ろにスキップするのと同様に実装できます。ユーザーがシークバーをドラッグできるようにするには、シークバーでonProgressUpdateメソッドを実装し、その位置をサービスに渡します。 –
コメントのためのあなたの貴重な時間のためにちょっとWickhamおかげで、私は次の曲を再生するときに私の曲はスキップして、私はこのようなサービスから私のシークバーを更新しようとすると適切な順序で再生されません。 プライベートvoid playMedia(){ if(!mediaPlayer.isPlaying()){ mediaPlayer.start(); mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext); mLocalBroadcastManager.sendBroadcast(intent_brodcast_seekbar); } } 私が更新用のシークバーを削除した場合、私は適切な曲の順序を維持できます。 –