极光推送自定义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,呵呵呵呵。
还好只浪费了半个小时……

你可能感兴趣的:(极光推送自定义notification sound + SoundPool的使用)