讓 MediaStyle 的提醒功能在 Android O 上為你服務
簡介
如果你在 API level 25 或以下的版本上用 MediaStyle
的提醒功能,這篇文章充當把這功能遷移到 Android O 上的指引。MediaStyle
的提醒功能通常是有限制的,並在後臺開啟那些允許音訊回放的服務。
Android O 的一些主要的區別需要被考慮到。
- 後臺要以
[startForegroundService(Intent)](https://developer.android.cn/preview/features/background.html#services)
開頭, 而且五秒內一定要出現個持續性的提醒。 - 如果要顯示提醒就一定要用到提醒渠道。
整合到 Android O 的遷移需要以下幾個小步驟。
第一步:改變匯入的語句
記得把下面的程式碼加到你的匯入語句中:
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.media.app.NotificationCompat.MediaStyle;</pre>
複製程式碼
或許之前會有 v7 的匯入語句,但現在已經不再需要:
import android.support.v7.app.NotificationCompat;</pre>
複製程式碼
現在你的 build.gradle
檔案裡,只需要匯入包含 MediaStyle
類的 media-compat
函式庫。
implementation ‘com.android.support:support-media-compat:26.+’</pre>
複製程式碼
MediaStyle
在 android.support.v4.media
這個包裡因為它現在是 [media-compat](https://developer.android.cn/topic/libraries/support-library/packages.html#v4-media-compat)
依賴的一部分。特意不將它們放在 support-compat
庫裡的原因是保持支援庫模組裡的關注點分離。
第二步:用 NotificationCompat 和渠道
為了在 Android O 裡用到提醒功能,你一定要用提醒渠道。v4 支援庫現在有為了建立提醒的新構造器:
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(mContext, CHANNEL_ID);</pre>
複製程式碼
老的構造器到了 26.0.0 版的支援庫就不能用了,因而你在用 API 26 的時候提醒就不會顯示(因為渠道在 API 26 裡是提醒功能的先要條件):
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(mContext);</pre>
複製程式碼
為了更好地理解 Android O 裡的渠道,請在 developer.android.cn 上閱讀所有相關資訊。Google Play Music 可以讓你自定義提醒訊息。例如,如果你只關心”重放“相關的提醒,就可以只啟用與之相關的提醒並禁用其他。
NotificationCompat
這個類並不幫你建立渠道,你依然要自己建立一個。這裡有一個 Android O 的例子。
private static final String CHANNEL_ID = "media_playback_channel";
@RequiresApi(Build.VERSION_CODES.O)
private void createChannel() {
NotificationManager
mNotificationManager =
(NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
// 渠道 ID
String id = CHANNEL_ID;
// 使用者看到的渠道名字
CharSequence name = "Media playback";
// 使用者看到的渠道描述
String description = "Media playback controls";
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
// 渠道的配置
mChannel.setDescription(description);
mChannel.setShowBadge(false);
mChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
mNotificationManager.createNotificationChannel(mChannel);
}
複製程式碼
這段程式碼利用 NotificationCompat
生成 MediaStyle
提醒。
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.media.app.NotificationCompat.MediaStyle;
//...
// 你只需要在 API 26 以上的版本建立渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(mContext, CHANNEL_ID);
notificationBuilder
.setStyle(
new MediaStyle()
.setMediaSession(token)
.setShowCancelButton(true)
.setCancelButtonIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(
mContext, PlaybackStateCompat.ACTION_STOP)))
.setColor(ContextCompat.getColor(mContext, R.color.notification_bg))
.setSmallIcon(R.drawable.ic_stat_image_audiotrack)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setOnlyAlertOnce(true)
.setContentIntent(createContentIntent())
.setContentTitle(“Album”)
.setContentText(“Artist”)
.setSubText(“Song Name”)
.setLargeIcon(MusicLibrary.getAlbumBitmap(mContext, description.getMediaId()))
.setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(
mService, PlaybackStateCompat.ACTION_STOP));
view rawMediaStyleNotification.java hosted with ❤ by GitHub
複製程式碼
第三步:用 ContextCompat 來啟用 startForegroundService()
在 Android O裡,像音樂重放這類理應是在後臺執行的服務需要用 Context.startForegroundService()
而不是 Context.startService()
來啟動。如果你在 Android O 上,就可以用 ContextCompat
這個類來自動幫你完成,如果你在 Android N 或之前的版本就需要用 startService(Intent)
來啟動。
if (isPlaying && !mStarted) {
Intent intent = new Intent(mContext, MusicService.class);
ContextCompat.startForegroundService(mContext, intent);
mContext.startForeground(NOTIFICATION_ID, notification);
mStarted = true;
}
複製程式碼
就是那麼簡單!三個簡單步驟就能幫你把 MediaStyle
的後臺提醒功能從 Android O 之前的版本遷移到 Android O 上。
關於 MediaStyle
更新的更多資訊,請看這裡
安卓(Android)媒體資源
- Understanding MediaSession
- Building a simple audio playback app using MediaPlayer
- Android Media API Guides — Media Apps Overview
- Android Media API Guides — Working with a MediaSession
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。