极光推送自定义notification sound + SoundPool的使用

从需求说起吧,产品经理/老板说有客户想要有推送通知到达的时候有声音,为了凸显公司的特色我们自己定义个通知声加进去吧。就这么个需求iOS实现起来还是挺简单的,根据文档拖一个符合要求的格式(不要超过30秒)例如叫notif.caf放到项目根目录,极光推送的时候把sound字段设置为notif.caf就行了。
Android的话有几种办法,一个是完全自定义notification的样式,包括ui+声音。不过我们一直用默认的用得好好的就没必要折腾了,选择的方案是ui仍然用原生的,而且后台发推送的时候给android发送的是无声的,我们在onReceive()里面自己播放自定义声音。
于是一查SoundPool就开干了,看api还是很简单的:新建个sound pool,load然后加载,代码自然就出来了:

SoundPool.Builder builder = new SoundPool.Builder();
builder.setMaxStreams(1);
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
attrBuilder.setLegacyStreamType(AudioManager.STREAM_ALARM);
builder.setAudioAttributes(attrBuilder.build());
SoundPool soundPool = builder.build();

新建一个,为了保证能播放成功最好在load成功的回调里边播放,结果as的自动补全给了一段这样的代码:

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int i, int i1) {

    }
});

嗯?i, i1什么玩意儿(论参数命名的重要性……),肯定是状态什么的不管了。然后在里边play,play函数的签名如下:

play(int, float, float, int, int, float))(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

于是就这么掉坑里了:

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int i, int i1) {
        soundPool.play(R.raw.bird, 0.99f, 0.99f, 0, 0, 1);
    }
});

soundID嘛,那个res id也是id,放进来非常合理,于是编译-通过,运行-通过,测试 - 没声音。。。换了几个android版本的测试机还是这样,只能狗哥家搜了下发现是这么弄的:

SoundPool.Builder builder = new SoundPool.Builder();
builder.setMaxStreams(1);
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
attrBuilder.setLegacyStreamType(AudioManager.STREAM_ALARM);
builder.setAudioAttributes(attrBuilder.build());
SoundPool soundPool = builder.build();
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        if (status == 0) {
            soundPool.play(sampleId, 0.99f, 0.99f, 0, 0, 1);
        }
    }
});
soundPool.load(context, R.raw.bird, 0);

那两个as自作聪明给我补全的参数原名是sampleId和status,呵呵呵呵。
还好只浪费了半个小时……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,469评论 25 709
  • 在你面前 宇宙局促,我局促 我的房子歪了 心术不正 为你造大火 大火屠城一千里 如阿房 造大佛 大如一粒钻石 一粒...
    我是不是蝎大人阅读 2,472评论 0 0
  • 离家不远的地方有个园林商城,是出售各种花卉、盆栽、植物种子以及相关的工具和肥料等的地方。 这家园林商城门面并不醒目...
    cola的春天阅读 2,256评论 2 8
  • 维生素:是一大类化学结构与生理功能各不相同的有机物质。它们都是天然存在于食物中、人体不能合成、需要量甚微、各有特殊...
    小葆大妮儿阅读 5,285评论 0 0
  • Java中的除法,若两个数都为整数,结果只能为整数。 修改方法:在任一个数后加上.0 Java中定义变量,可以先不...
    _Raye阅读 2,571评论 0 0