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

      让 MediaStyle 的提醒功能在 Android O 上为你服务

简介

如果你在 API level 25 或以下的版本上用 MediaStyle 的提醒功能,这篇文章充当把这功能迁移到 Android O 上的指引。MediaStyle 的提醒功能通常是有限制的,并在后台开启那些允许音频回放的服务。

Android O 的一些主要的区别需要被考虑到。

  1. 后台要以 [startForegroundService(Intent)](https://developer.android.cn/preview/features/background.html#services) 开头, 而且五秒内一定要出现个持续性的提醒。
  2. 如果要显示提醒就一定要用到提醒渠道。

整合到 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>

MediaStyleandroid.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)媒体资源

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小巫技术博客

Android简单通用数据传输工具

793
来自专栏腾讯Bugly的专栏

从 Android 静音看正确的查找 bug 的姿势

0、写在前面 没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT。。话说年关难过,bug 多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤。。。艾玛,扯...

3526
来自专栏QQ音乐技术团队的专栏

Android系统线控和歌曲信息屏显的那点事

目前Android系统中主流的音乐播放器都支持线控的功能,线控设备包括有线耳机和蓝牙耳机或蓝牙车机,当不方便操作手机的时候可以通过线控来控制音乐的播...

4498
来自专栏何俊林

如何进行网络视频截图/获取视频的缩略图

小编导读:获取视频的缩略图,截图正在播放的视频某一帧,是在音视频开发中,常遇到的问题。本文是主要用于点播中截图视频,同时还可以获取点播视频的缩略图进行显示,留下...

1K7
来自专栏Flutter入门到实战

Android适配全面总结(三)----ROM适配

版权声明:本文为博主原创文章(部分引用他人博文,已加上引用说明),未经博主允许不得转载。https://www.jianshu.com/p/f9c67a4b90...

2571
来自专栏图像识别与深度学习

《Android》Lesson16-Fragment

1626
来自专栏C语言及其他语言

Android应用架构

来源: 小鄧子(@Rx小鄧子) Android开发生态圈的节奏非常之快。每周都会有新的工具诞生,类库的更新,博客的发表以及技术探讨。如果你外出度假一个月,当你回...

3917
来自专栏wOw的Android小站

[Android]暗码机制

因为之前改过Dialer,定制过相关的暗码功能,所以没多想就直接把intent-filter加在MainActivity中了。然后测试告诉我,输入”*#*#36...

2231
来自专栏葬爱家族

Android高德之旅(1)基础地图

这个系列之前在CSDN上就发了,不过刚开始就因为公司项目忙搁置了,现在转移阵地到简书,希望这次能坚持把这个系列做完。

912
来自专栏项勇

笔记58 | Android闹钟

2533

扫码关注云+社区