「 征文 」Jpush 自定义推送声音

android
jpush
征文
标签: #<Tag:0x00007fb83bd7f5f0> #<Tag:0x00007fb83bd7f4b0> #<Tag:0x00007fb83bd7f370>

(maimingliang) #1

前言

最近的项目需要自定义推送声音,然而极光的文档,说得模凌两可的,弄来弄去整了一天才搞好这个自定义推送声音,因此记录一下。

实现思路

极光推送包含有通知与自定义消息两种类型的推送。因此可以发送三种方式的推送:

  1. 通知
  2. 自定义消息
  3. 通知 + 自定义消息

要实现自定义推送声音,需要使用第二种方式。

代码实现

使用自定义消息,在客户端App里需要接受 JPush SDK 的广播:

public class MyReceiver extends BroadcastReceiver {

	private static final String TAG = "JPush";

	@Override
	public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
 
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...
                        
        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
        	Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
        	processCustomMessage(context, bundle);
        
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知");
            int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId);
        	
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户点击打开了通知");
            
        	//打开自定义的Activity
        	Intent i = new Intent(context, TestActivity.class);
        	i.putExtras(bundle);
        	//i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        	i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
        	context.startActivity(i);
        	
        } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA));
            //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等..
        	
        } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
        	boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
        	Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
        } else {
        	Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
        }
	}


    /**
	 * 实现自定义推送声音
	 * @param context
	 * @param bundle
     */

	private void processCustomMessage(Context context, Bundle bundle) {

		NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);



		NotificationCompat.Builder notification = new NotificationCompat.Builder(context);

		notification.setAutoCancel(true)
				.setContentText("自定义推送声音")
				.setContentTitle("极光测试")
				.setSmallIcon(R.mipmap.ic_launcher);

		String message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
		String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
 		if (!TextUtils.isEmpty(extras)) {
			try {
				JSONObject extraJson = new JSONObject(extras);
				if (null != extraJson && extraJson.length() > 0) {


					String sound = extraJson.getString("sound");

					if("test.mp3".equals(sound)){
						notification.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" +R.raw.test));
					}


				}
			} catch (JSONException e) {

			}

		}
		Intent mIntent = new Intent(context,TestActivity.class);

		mIntent.putExtras(bundle);
		PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, mIntent, 0);

		notification.setContentIntent(pendingIntent);

		notificationManager.notify(2, notification.build());

	}
}

测试

打开jpush控制台,模拟发送自定义消息。如图:

选择可选设置,填写附加字段。如图:

这里的test.mp3,我保存在raw文件下,如图:

Jpush自定义推送声音demo

项目中的账号,是个人申请的,如果需要账号测试,可以联系我。


征文大赛颁奖仪式——快来抱走你的奖品
极光推送如何打开声音震动与是否接收消息
极光后台自定义消息调用的哪个接口
Android的极光推送可以定制提醒声音吗?
这个 Filco 键盘即将送出——征文大赛不那么圆满的结束啦
一次通知出现两次声音
常见问题 - JPush 合集(持续更新)
Android客户端 关闭或打开通知的提示音及震动
(mark_beat) #2

为什么? 使用 通知 + 自定义消息方式, 为什么提示的声音 还是会通知的默认的声音的?


(maimingliang) #3

@官方 是不是 两者同时存在,通知的优先级高?


#4

这个可能得看自定义消息的展示是怎么实现的,在什么时候展示。
1.首先单独发自定义消息,声音是否正常播放
2.同时发,收到后是同时展示吗?(同一app同时收到的通知到来的提示音可能在手机端会互相有影响,具体的还有待测试。
3.是否因某些原因存在优先级的问题还需要咨询一下。


(mark_beat) #5

正如楼主说的,用第二种方式,单独发自定义消息是可以的。如果 是 同时发 通知 + 自定义消息,只有通知的声音。


#6

如果你想要自定义通知栏效果,就应该引导后台避免发送【通知】的消息类型了,也就是说两种消息不要同时发。

一般两种消息同时发是这种场景:通知用来展示,自定义消息用来取消息内容做其他的事情,而不做横幅展示提醒。

我们这边的测试结果是:
极光默认的通知和你们自己自定义消息构建的通知互不影响。


(maimingliang) #7

嗯嗯,两种消息最好不要同时发。


自定义铃声的声音长度
(秋天) #8

到现在最新的SDK也不支持通知更改铃声吗?


(Esport) #9

按照你的方法写了,大部分手机可以使用,但是小米手机的自定义声音不是每次都会出现,如何解决?


(LJIAMING) #10

notificationManager.notify(2, notification.build());这里的2是随便一个数都可以还是从那里传过来的id?