[英]Android Music Player Notification with Progress Bar
我正在開發帶有進度條的音樂播放器通知。 我設法以某種方式設法顯示了Handler的進度,但現在的問題是一段時間后整個android系統死機了。 然后重新啟動系統只是解決方案。 我是android的新手,這是我的第一個應用程序,請幫助我完成我的第一個應用程序。 我會非常感謝你。
我已經附上了通知的屏幕截圖,這是我的代碼。 這些代碼在Media Player前台服務中運行
一些全局變量:
private static RemoteViews views;
private static RemoteViews bigViews;
private static Notification status;
private static final int NOTIFICATION_ID = 101;
public Handler mSeekbarUpdateHandler= new Handler();
這是可運行的代碼:
public Runnable mUpdateseekbar=new Runnable() {
@Override
public void run() {
if(mediaPlayer != null) {
bigViews.setProgressBar(R.id.progressBar, mediaPlayer.getDuration(), mediaPlayer.getCurrentPosition(), false);
bigViews.setTextViewText(R.id.time_start, timeConvert(mediaPlayer.getCurrentPosition()));
}
startForeground(NOTIFICATION_ID, status);
mSeekbarUpdateHandler.postDelayed(this,1000);
}};
現在調用處理程序:
@Override
public void onPlay() {
super.onPlay();
resumeMedia();
buildNotification(PlaybackStatus.PLAYING);
mSeekbarUpdateHandler.postDelayed(mUpdateseekbar,0);
//also calling this Handler from method onSkipToNext() and previous. it means when changing song also calling Handler each time.
最后構建通知代碼:
private void buildNotification(PlaybackStatus playbackStatus)
{
//This section containing long code which works fine so no need to make post longer.
}
幾分鍾后運行此代碼時,系統變慢並最終凍結。 刪除處理程序后,通知中沒有問題,但進度條未更新。
}
每次在Runnable中重新構建整個通知時,我已經成功解決了此問題。我已將以下Runnable代碼替換為以下代碼...
public Runnable mUpdateseekbar = new Runnable() {
@Override
public void run() {
if (mediaPlayer.isPlaying()) {
buildNotification(PlaybackStatus.PLAYING);
}
mSeekbarUpdateHandler.postDelayed(this, 1000);
}
};
這是buildNotification方法。
private void buildNotification(PlaybackStatus playbackStatus) {
RemoteViews views;
RemoteViews bigViews;
Notification status;
try {
int notificationAction = android.R.drawable.ic_media_pause;
PendingIntent play_pauseAction = null;
if (playbackStatus == PlaybackStatus.PLAYING) {
notificationAction = R.drawable.noty_pause;
play_pauseAction = playbackAction(1);
} else if (playbackStatus == PlaybackStatus.PAUSED) {
notificationAction = R.drawable.noty_play;
play_pauseAction = playbackAction(0);
}
views = new RemoteViews(getPackageName(),
R.layout.status_bar);
bigViews = new RemoteViews(getPackageName(),
R.layout.status_bar_expanded);
views.setImageViewBitmap(R.id.status_bar_album_art,
largeIcon);
bigViews.setImageViewBitmap(R.id.status_bar_album_art,
largeIcon);
views.setImageViewResource(R.id.status_bar_playPause,
notificationAction);
bigViews.setImageViewResource(R.id.status_bar_play,
notificationAction);
bigViews.setProgressBar(R.id.progressBar, mediaPlayer.getDuration(), mediaPlayer.getCurrentPosition(), false);
views.setTextViewText(R.id.status_bar_track_name, activeAudio.getTitle());
bigViews.setTextViewText(R.id.status_bar_track_name, activeAudio.getTitle());
views.setTextViewText(R.id.status_bar_artist_name, activeAudio.getAlbum() + "-" + activeAudio.getArtist());
bigViews.setTextViewText(R.id.status_bar_artist_name, activeAudio.getAlbum() + "-" + activeAudio.getArtist());
views.setTextViewText(R.id.status_bar_metadata, displayMeta);
bigViews.setTextViewText(R.id.status_bar_album_name, displayMeta);
bigViews.setTextViewText(R.id.track_num, (audioIndex + 1) + "/" + audioList.size());
bigViews.setTextViewText(R.id.end_time, timeConvert(mediaPlayer.getDuration()));
bigViews.setTextViewText(R.id.time_start, timeConvert(mediaPlayer.getCurrentPosition()));
views.setOnClickPendingIntent(R.id.status_bar_playPause, play_pauseAction);
bigViews.setOnClickPendingIntent(R.id.status_bar_play, play_pauseAction);
views.setOnClickPendingIntent(R.id.status_bar_next, playbackAction(2));
bigViews.setOnClickPendingIntent(R.id.status_bar_next, playbackAction(2));
views.setOnClickPendingIntent(R.id.status_bar_previous, playbackAction(3));
bigViews.setOnClickPendingIntent(R.id.status_bar_prev, playbackAction(3));
bigViews.setOnClickPendingIntent(R.id.status_bar_ff, playbackAction(5));
bigViews.setOnClickPendingIntent(R.id.status_bar_rev, playbackAction(6));
bigViews.setOnClickPendingIntent(R.id.status_bar_collapse, playbackAction(4));
views.setOnClickPendingIntent(R.id.status_stop,playbackAction(4));
status = new Notification.Builder(this).build();
status.contentView = views;
status.bigContentView = bigViews;
status.flags = Notification.FLAG_ONGOING_EVENT;
status.visibility = Notification.VISIBILITY_PUBLIC;
status.tickerText = activeAudio.getTitle();
if (playbackStatus==PlaybackStatus.PLAYING) {
status.icon = R.drawable.notyskeep;
} else {
status.icon = R.drawable.noty_small_blue;
}
status.priority = Notification.PRIORITY_MAX;
status.contentIntent = playbackAction(8);
startForeground(NOTIFICATION_ID, status);
} catch (Throwable e) {
Toast.makeText(getApplicationContext(), "Exception raised:" + e, Toast.LENGTH_LONG).show();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.