在 Android O 上用到 MediaStyle 的提醒功能

      讓 MediaStyle 的提醒功能在 Android O 上爲你服務

簡介

若是你在 API level 25 或如下的版本上用 MediaStyle 的提醒功能,這篇文章充當把這功能遷移到 Android O 上的指引。MediaStyle 的提醒功能一般是有限制的,並在後臺開啓那些容許音頻回放的服務。html

Android O 的一些主要的區別須要被考慮到。前端

  1. 後臺要以 [startForegroundService(Intent)](https://developer.android.cn/preview/features/background.html#services) 開頭, 並且五秒內必定要出現個持續性的提醒。
  2. 若是要顯示提醒就必定要用到提醒渠道。

整合到 Android O 的遷移須要如下幾個小步驟。java

第一步:改變導入的語句

記得把下面的代碼加到你的導入語句中:react

import android.support.v4.app.NotificationCompat;  
import android.support.v4.content.ContextCompat;  
import android.support.v4.media.app.NotificationCompat.MediaStyle;</pre>
複製代碼

或許以前會有 v7 的導入語句,但如今已經再也不須要:android

import android.support.v7.app.NotificationCompat;</pre>
複製代碼

如今你的 build.gradle 文件裏,只須要導入包含 MediaStyle 類的 media-compat 函數庫。ios

implementation ‘com.android.support:support-media-compat:26.+’</pre>
複製代碼

MediaStyleandroid.support.v4.media 這個包裏由於它如今是 [media-compat](https://developer.android.cn/topic/libraries/support-library/packages.html#v4-media-compat) 依賴的一部分。特地不將它們放在 support-compat 庫裏的緣由是保持支持庫模塊裏的關注點分離。git

第二步:用 NotificationCompat 和渠道

爲了在 Android O 裏用到提醒功能,你必定要用提醒渠道。v4 支持庫如今有爲了建立提醒的新構造器:github

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 可讓你自定義提醒消息。例如,若是你只關心」重放「相關的提醒,就能夠只啓用與之相關的提醒並禁用其餘。bash

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)媒體資源



掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索