Android 极光推送JPush---自定义提示音
极光推送提供三种方法实现Notification通知
- 三方开发平台发送普通消息,客户端设置PushNotificationBuilder,实现基础的Notification通知
- 三方开放平台发送普通消息,客户端设置CustomPushNotificationBuilder,实现高级自定义的Notification通知
- 三方开放平台发送自定义消息,客户端默认不处理此类消息,客户端定义Receiver接收自定义消息并进行处理
- 使用普通内容为空,将普通消息转成自定义消息类型,进而达到所需效果
但是前三种方案无法实现自定义声音,只有第四种方案可实现自定义Notification并进行通知
尝试方案一:
思路:接收三方开放平台自定义消息,自定义Notification更改提示音
AndroidManifest.xml
<receiver
android:name=".application.MyReceiver"
android:enabled="true">
<intent-filter > <!-- Required 用户注册SDK的intent -->
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<!-- Required 用户接收SDK消息的intent -->
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<!-- Required 用户接收SDK通知栏信息的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<!-- Required 用户打开自定义通知栏的intent -->
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<!-- Optional 用户接受Rich Push Javascript 回调函数的intent -->
<action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" />
<!-- 接收网络变化 连接/断开 since 1.6. -->
<action android:name="cn.jpush.android.intent.CONNECTION" /> <category android:name="应用包名" />
</intent-filter>
</receiver>
MyReceiver.java
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = MyReceiver.class.getSimpleName();
private static final int NOTIFICATION_SHOW_SHOW_AT_MOST = ; //推送通知最多显示条数
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle =intent.getExtras();
//
if(intent.getAction().equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)){
Log.i(TAG, "接收到了通知");
String title=bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
String content=bundle.getString(JPushInterface.EXTRA_ALERT);
String extra=bundle.getString(JPushInterface.EXTRA_EXTRA);
Log.i(TAG, "标题:【"+title+"】,内容:【"+content+"】,附加参数:【"+extra+"】");
}else if(intent.getAction().equals(JPushInterface.ACTION_MESSAGE_RECEIVED)){
Log.i(TAG, "接收到了消息");
String message =bundle.getString(JPushInterface.EXTRA_MESSAGE);
processCustomMessage(context, bundle);
Log.i(TAG, "接收到的消息是:【"+message+"】");
}else if(intent.getAction().equals(JPushInterface.ACTION_NOTIFICATION_OPENED)){
Log.i(TAG, "用户正在打开通知");
}
}
/**
* 实现自定义推送声音
* @param context
* @param bundle
*/
private void processCustomMessage(Context context, Bundle bundle) {
NotificationCompat.Builder notification = new NotificationCompat.Builder(context);
String title = bundle.getString(JPushInterface.EXTRA_TITLE);
String msg = bundle.getString(JPushInterface.EXTRA_MESSAGE);
String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.icon_mdpi);
Intent mIntent = new Intent(context,****.class);
mIntent.putExtras(bundle);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, , mIntent, );
notification.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setContentText(msg)
.setContentTitle(title.equals("") ? "title": title)
.setSmallIcon(R.mipmap.icon_mdpi)
.setLargeIcon(bitmap)
.setNumber(NOTIFICATION_SHOW_SHOW_AT_MOST);
Log.e(TAG, "processCustomMessage: extras----->" + extras);
if (!TextUtils.isEmpty(extras)) {
try {
JSONObject extraJson = new JSONObject(extras);
if (null != extraJson && extraJson.length() > ) {
String sound = extraJson.getString("sound");
if("".equals(sound)){
notification.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" +R.raw.default_push_sound));
} else {
notification.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" +R.raw.test));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_SHOW_SHOW_AT_MOST, notification.build()); //id随意,正好使用定义的常量做id,0除外,0为默认的Notification
}
}
效果实现了,跟服务端沟通,发现只有开发平台上有自定义消息,服务端没自定义消息的api接口,烦唷!!!
尝试方案二:
思路:查看接口文档,发现极光推送采用Receiver接收普通消息和自定义消息,通过拦截广播,不让极光三方库处理默认的Notification 查看极光AndroidManifst.xml的PushReceiver配置
<!-- Required SDK核心功能 -->
<receiver
android:name="cn.jpush.android.service.PushReceiver"
android:enabled="true">
<intent-filter android:priority="">
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!-- Required 显示通知栏 -->
<category android:name="应用包名" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<!-- Optional -->
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="应用包名" />
</intent-filter>
</receiver>
发现极光推送通过PushReceiver来代理接收派发普通消息和自定义消息。那我就利用MyReceiver,而且优先级为65535,保证最先接收到消息 在MyReceiver中普通消息过滤中添加abortBroadcast(); 吸收广播,禁止往下传递广播,运行后提示“BroadcastReceiver trying to return result during a non-ordered broadcast”,居然是无序广播。。。 这。。。。极光你就不能给个活路么
尝试方案三:
思路:不让我自定义,那我就把默认的铃声去掉,然后在接收到普通消息广播之后使用SoundPool播放提示音乐
init JPush之后
BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(this);
builder.notificationDefaults = Notification.DEFAULT_LIGHTS;
builder.statusBarDrawable = R.drawable.icon_mdpi;
builder.notificationFlags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
JPushInterface.setPushNotificationBuilder(, builder);
notificationDefaults 是通过设置二进制位来判断的,DEFAULT_SOUND= 使用红米Note4做测试,还是会有提示音。。 不想做了。。。
尝试方案四:
思路:查看文档时无意间发现,当普通通知内容为空,将不执行默认的Notification,使用extra传递Notification.title和Notification.msg,再接收到普通消息之后执行之前实现的自定义processCustomMessage方法
接受广播
如果全部类型的广播都接收,则需要在 AndroidManifest.xml 里添加如下的配置信息:
<receiver
android:name="Your Receiver"
android:enabled="true">
<intent-filter>
<action android:name="cn.jpush.android.intent.REGISTRATION" />
<action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
<action android:name="cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION" />
<action android:name="cn.jpush.android.intent.CONNECTION" />
<category android:name="You package Name" />
</intent-filter>
</receiver>
Action - JPushInterface.ACTION_NOTIFICATION_RECEIVED.
字符串值 "cn.jpush.android.intent.NOTIFICATION_RECEIVED" 功能描述:
收到了通知 Push。
如果通知的内容为空,则在通知栏上不会展示通知。
但是,这个广播 Intent 还是会有。开发者可以取到通知内容外的其他信息。
终于搞定了,再也不想用极光,好麻烦-。-
Android 极光推送JPush---自定义提示音的更多相关文章
- 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...
- 关于极光推送Jpush的demo
关于极光推送Jpush 推送是手机app必不可少的一样功能,这次由于公司项目需要研究了一下.由于推送一般写于服务端,所以对于不会Android的javaweb程序员要写出一个完整的demo是一件很头痛 ...
- Android 极光推送造成IM服务绑定失败bug
由于极光推送对8.0的支持问题,升级到了最新版本的极光推送.但是最新版本的极光推送,默认将推送服务设置到了新的进程里面,由此引发 Android 极光推送多进程造成的application运行两次 和 ...
- 李洪强iOS开发之极光推送JPush
李洪强iOS开发之极光推送JPush
- Android消息推送——JPush极光推送
刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...
- 极光推送 JPush 简介 集成 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 极光推送JPush的快速集成
首先到极光推送的官网上创建一个应用,填写对应的应用名和包名. 创建好之后下载Demo 提取Sdk里面的图片和xml等资源文件放自己项目的相应位置,然后要注意的是.so文件的放置位置: 在main目录下 ...
- 极光推送Jpush(v3)服务端PHP版本的api脚本类
原文地址:http://www.dodobook.net/php/780 关于极光推送的上一篇文章已经说明了,此处就不多说了.使用v3版本的原因是v2使用到2014年年底就停止了.点击查看上一篇的地址 ...
- 极光推送Jpush(v3)服务端PHP版本集成(V3版本只调用推送API)
因为版本升级,极光推送的API也有了V3,功能也更丰富了,但是对于我们有的用户来说,我们还是只需要调用推送的API就够了. 下载了一份PHP服务端的SDK(下载地址:http://docs.jpush ...
随机推荐
- [BZOJ3337] ORZJRY I --块状链表大毒瘤
link 题目大意:维护一个序列 支持: 1.单点插入 2.单点删除 3.区间翻转 4.区间旋转 5.区间加 6.区间赋值 7.询问区间和 8.询问区间极差 9.询问区间与给定某个数差值绝对值的最小值 ...
- [转载]C#实现获取浏览器信息
原文地址:C#实现获取浏览器信息作者:flywithme Request.Browser.MajorVersion.ToString();//获取客户端浏览器的(主)版本号 Request.Bro ...
- 5.Min Stack(能返回最小数的栈)
Level: Easy 题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element ...
- Palindromes _easy version(reverse)
Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.请写一个程序判断读入的字符串是否是“回文”. Input 输入包 ...
- SSKeychain的使用 钥匙串
一.首先要理解keychain与userdefaults的区别: 1.keychain是将数据加密后存储在本地,更安全.路径:Library/Application Support/iPhone Si ...
- mysql的时区错误问题
JDBC连接数据库报错如下: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or r ...
- error : Could not load UI satellite dll 'TrackerUI.dll'. Make sure it exists in an LCID subdirectory of 'C:\Program Files (x86)\MSBuild\12.0\bin\'.
原因 VS2013 + QT环境部署好后, 又安装了VS2015\ 解决方案: 在另一台电脑里重装VS2013, 并将 C:\Program Files (x86)\MSBuild\12.0\B ...
- MySQL安全优化
一.数据库相关 1. MySQL版本的选择 在正式生产环境中,建议使用5.6或以上系列的版本(5.7不建议,曾经用过这个版本,问题有点多). 2. 运行用户与端口的配置 2.1.确保MySQL运行用户 ...
- Lintcode 摊平嵌套的列表
/** * // This is the interface that allows for creating nested lists. * // You should not implement ...
- bash 中 trim 字符串(去除首尾空格) - grep 去空行
在 bash 下如何去除一个字符串首尾的空格(也就是 trim)呢?其实有一个简单的办法: $ echo $STR 注 意 $STR 不要带引号.因为 $STR 展开后,会作为 echo 的参数.那么 ...