极光推送自定义notification sound + Soun
2017-10-27 本文已影响53人
darkengine
从需求说起吧,产品经理/老板说有客户想要有推送通知到达的时候有声音,为了凸显公司的特色我们自己定义个通知声加进去吧。就这么个需求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,呵呵呵呵。
还好只浪费了半个小时……