public class MyApplication extends MyApp {
@Override
public void onCreate() {
super.onCreate();
context = this;
TIMManager.getInstance().setOfflinePushListener(new TIMOfflinePushListener() {
@Override
public void handleNotification(TIMOfflinePushNotification var1) {
}
});
TIMManager.getInstance().addMessageListener(new TIMMessageListener() {
@Override
public boolean onNewMessages(List<TIMMessage> msgs) {
showNotice(msgs);
return false;
}
});
notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
}
public void showNotice(List<TIMMessage> msgs) {
if (msgs.size() > 0) {
final TIMMessage timMessage = msgs.get(msgs.size() - 1);
List<String> users = new ArrayList<>();
users.add(timMessage.getSender());
if (users.size() > 0)
TIMFriendshipManager.getInstance().getUsersProfile(users, false, new TIMValueCallBack<List<TIMUserProfile>>() {
@Override
public void onError(int code, String desc) {
//错误码 code 和错误描述 desc,可用于定位请求失败原因
//错误码 code 列表请参见错误码表
}
@Override
public void onSuccess(List<TIMUserProfile> result) {
if (result.size() > 0) showNotice(timMessage, result.get(0));
}
});
}
}
private void showNotice(TIMMessage timMessage, TIMUserProfile timUserProfile) {
MessageInfo messageInfo = MessageInfoUtil.TIMMessage2MessageInfo(timMessage, false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setChannerl();
}
createNotification(timUserProfile.getNickName(), String.valueOf(messageInfo.getExtra()));
}
public boolean getSound() {
if (!TextUtils.isEmpty(msg_notic2) && msg_notic2.equals("1"))
return true;
else
return false;
}
public boolean getVibrate() {
if (!TextUtils.isEmpty(msg_notic1) && msg_notic1.equals("1")) {
return true;
} else
return false;
}
long[] pattern = new long[]{1000, 1000, 1000, 1000, 1000};
String beforeChannelId = "1";
NotificationManager notificationManager;
@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(boolean isVibrate, String channelId, String channelName,
int
importance) {
if (!TextUtils.isEmpty(beforeChannelId)) {
//先删除之前的channelId对应的消息通道.
notificationManager.deleteNotificationChannel(beforeChannelId);
}
//重新new一个消息通道。
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
//是否震动
if (getVibrate()) {
// 设置通知出现时的震动(如果 android 设备支持的话)
channel.enableVibration(true);
channel.setVibrationPattern(pattern);
} else {
// 设置通知出现时不震动
channel.enableVibration(false);
channel.setVibrationPattern(new long[]{0});
}
if (getSound()) {
// 设置通知出现时的震动(如果 android 设备支持的话)
channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), Notification.AUDIO_ATTRIBUTES_DEFAULT);
} else {
// 设置通知出现时不震动
channel.setSound(null, null);
}
notificationManager.createNotificationChannel(channel);
}
private void createNotification(String nickName, String content) {
Intent intent = new Intent(this, MainActivity.class);
/*
* 调用PendingIntent的静态放法创建一个 PendingIntent对象用于点击通知之后执行的操作,
* PendingIntent可以理解为延时的Intent,在这里即为点击通知之后执行的Intent
* 这里调用getActivity(Context context, int requestCode, Intent intent, int flag)方法
* 表示这个PendingIntent对象启动的是Activity,类似的还有getService方法、getBroadcast方法
*/
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
sendNotification(nickName, content, pi);
}
public void sendNotification(String title, String content, PendingIntent pi) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Notification notification = getChannelNotification
(title, content, pi).build();
notificationManager.notify(1, notification);
} else {
Notification notification = getNotification_25(title, content, pi).build();
notificationManager.notify(1, notification);
}
}
@TargetApi(Build.VERSION_CODES.O)
public Notification.Builder getChannelNotification(String title, String content, PendingIntent pi) {
return new Notification.Builder(getApplicationContext())
.setContentTitle(title) // 创建通知的标题
.setChannelId(channelId)
.setContentText(content) // 创建通知的内容
.setSmallIcon(R.mipmap.ic_launcher) // 创建通知的小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher)) // 创建通知的大图标
/*
* 首先,无论你是使用自定义视图还是系统提供的视图,上面4的属性一定要设置,不然这个通知显示不出来
*/
.setWhen(System.currentTimeMillis()) // 设定通知显示的时间
.setContentIntent(pi) // 设定点击通知之后启动的内容,这个内容由方法中的参数:PendingIntent对象决定
//.setPriority(NotificationCompat.PRIORITY_MAX) // 设置通知的优先级
.setAutoCancel(true); // 设置点击通知之后通知是否消失
}
public NotificationCompat.Builder getNotification_25(String title, String content, PendingIntent pi) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), "1")
.setContentTitle(title) // 创建通知的标题
.setContentText(content) // 创建通知的内容
.setSmallIcon(R.mipmap.ic_launcher) // 创建通知的小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher)) // 创建通知的大图标
/*
* 首先,无论你是使用自定义视图还是系统提供的视图,上面4的属性一定要设置,不然这个通知显示不出来
*/
.setWhen(System.currentTimeMillis()) // 设定通知显示的时间
.setContentIntent(pi) // 设定点击通知之后启动的内容,这个内容由方法中的参数:PendingIntent对象决定
// .setPriority(NotificationCompat.PRIORITY_MAX) // 设置通知的优先级
.setAutoCancel(true);
if (getSound() && getVibrate())
builder.setDefaults(Notification.DEFAULT_ALL).setVibrate(pattern).setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
else {
if (getVibrate()) {
builder.setDefaults(Notification.DEFAULT_VIBRATE).setVibrate(pattern);
} else if (getSound()) {
builder.setDefaults(Notification.DEFAULT_SOUND).setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
} else builder.setDefaults(Notification.FLAG_ONLY_ALERT_ONCE);
}
return builder;// 设置点击通知之后通知是否消失
}
String channelId;
int i;
private void setChannerl() {
channelId = "chat" + i++;//消息通道的id,以后可以通过该id找到该消息通道
String channelName = "聊天消息" + i;//消息通道的name
// .具体的请自行百度。作用就是优先级的不同。可以导致消息出现的形式不一样。
// MAX是会震动并且出现在屏幕的上方。设置优先级为low或者min时。来通知时都不会震动,
// 且不会直接出现在屏幕上方
createNotificationChannel(true, channelId, channelName, IMPORTANCE_HIGH);
beforeChannelId = channelId;
}
}
版权声明:本文为sky_castle原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。