目前市面上APP有很多第三方推送,如个推、极光、腾讯信鸽、百度云推送、友盟推送、云巴推送等,还有厂商系统级的推送,比如小米推送、华为推送,这个就很像ioses系统的APNs消息推送,可以做到不管你的APP是否在线,都能把消息推送到你的手机。
飘易手上的一个项目是基于html5 plus做的app项目,利用Hbuilder在线云端打包,集成了小米推送,怎么集成暂且不提,飘易只说一说安卓手机如何在消息到达的时候,自定义铃声。
根据小米官方文档,在服务器端创建消息时可以设置自定义铃声:
调用Message.Builder类的extra(String key, String value)方法将key设置为"sound_uri",value设置为铃声的URI。
铃声只能使用当前app内的资源,URI格式满足 androids.resource://your packagename/XXX/XXX。
铃声文件放在androids app的raw目录下。
只适用于通知栏消息。
存储的声音文件需要有扩展名,但是不要把扩展名写在uri中。
private Message buildMessage() throws Exception { String PACKAGENAME = "com.xiaomi.mipushdemo"; String messagePayload = “This is a message”; String title = “notification title”; String description = “notification description”; Message message = new Message.Builder() .title(title) .description(description).payload(messagePayload) .restrictedPackageName(MY_PACKAGE_NAME) .passThrough(0) //消息使用通知栏方式 .notifyType(1) .extra(Constants.EXTRA_PARAM_SOUND_URI, "androids.resource://" + PACKAGENAME + "/raw/shaking") .build(); return message;}很明显,小米要求蜜桃成人网站入口把自定义铃声放置在androids APP项目根目录的 res/raw/ 文件夹里。注意这个目录不能有子文件夹。而我使用的是Hbuilder云端打包,云端打包并没有办法添加 res/raw 文件夹里面的声音资源,咨询 hbuilder 官方DCloud,答复说暂时还不支持此功能,后续补充。
好吧。难道只能离线打包?为了一个铃声,要把所有引用的sdk重新在本地部署一遍?改动太大,还是算了。
灵光一现,飘易想到另一个思路:继续云端打包,下载打包好的 apk 文件,蜜桃成人网站入口进行反编译,在反编译后的res目录下添加raw文件夹,往里面添加音频文件,比如 shakingmp3.mp3 和 shakingaac.aac 两个音频。然后再编译成新的apk包,再将这个新apk包进行重新签名!
按照上面的思路走了一遍,发现果然好使!别问我为什么会想到,我是不会告诉你的。
下面飘易来带你们踩坑。。。
坑1:我刚开始不想反编译,直接把apk改成zip,然后往里面添加声音文件,同时删除原有的apk签名(删除里面的META-INF目录),然后重新改成apk后缀,再进行签名,不幸地失败了。
原因很简单,你直接添加资源,可是和资源关联的文件你并没有更新,是哪几个关联文件呢,客官请参考:
res/raw资源关联文件:
D:androidsJinyiyun_testappuildgeneratedsource debug etjinyiyunappjinyiyun_testR.javaD:androidsJinyiyun_testappuildintermediatessymbolsdebugR.txtD:androidsJinyiyun_testappuildintermediatesclassesdebug etjinyiyunappjinyiyun_testR$raw.class别问我怎么知道的,我是不会告诉你的。
坑2:嗯,还是算了,不让你们掉坑里去了,直接介绍正确的解锁姿势。
1、先安装 apktool 工具(前提是你电脑上已经安装好了java环境)
安装地址:http://ibotpeaches.github.io/Apktool/install/ 它也有github地址:http://github.com/iBotPeaches/Apktool 随便你们用哪个,按照介绍:
Windows:下载 apktool.bat 和 apktool.jar 把这2文件放到一个目录下。2、反编译apk包
apktool d bar.apk这个命令会把 bar.apk 解压到同名目录bar里面。
3、在bar目录里找到res文件夹下,创建 raw 子文件夹,往里面添加音频文件,比如上面的 shakingmp3.mp3 和 shakingaac.aac 两个音频。
4、重新编译新apk包
apktool b bar -o new_bar.apk这个命令会将bar目录重新编译成一个新的 new_bar.apk 包。
5、这个时候你拿到的新的apk包 并不能在手机上安装,你需要重新签名。
签名的工具是利用java自带的 jarsigner.exe 工具,命令是:
"C:Program FilesJavajdk1.8.0_45injarsigner.exe" -verbose -keystore "D:androidsandroids_key.keystore" -signedjar "D:TOOLApktoolsigned.apk" "D:TOOLApktool ew_bar.apk" Developer输入上述命令后,需要确认你当初生成keystore时设置的密码。
注意:
最后的Developer是你生成密钥时使用的 别名。
androids_key.keystore 是你生成的密钥(用java自带的 keytool 生成后缀为keystore的签名密钥)。
signed.apk 是签名后的安卓包,这个包就可以安装啦。
剩下的活就是服务器端的事了,直接贴一段代码吧: