package com.sinata.download.utils.notification;
|
|
import android.app.Activity;
|
import android.app.Notification;
|
import android.app.NotificationManager;
|
import android.app.PendingIntent;
|
import android.content.Context;
|
import android.content.Intent;
|
import android.media.MediaPlayer;
|
import android.media.RingtoneManager;
|
import android.net.Uri;
|
import android.os.Build;
|
import android.os.Vibrator;
|
import androidx.core.app.NotificationCompat;
|
import android.widget.RemoteViews;
|
|
import com.sinata.download.DownloadLibrary;
|
|
import static android.content.Context.NOTIFICATION_SERVICE;
|
|
|
/**
|
* author:Created by zhaohaoting on 2018/1/10 11:51
|
* email:526309416@qq.com
|
* desc:
|
*/
|
|
public class MessageNoticeManager {
|
private long[] pattern = {0, 500, 500, 500};
|
private MediaPlayer mp;
|
private NotificationManager manager;
|
|
private MessageNoticeManager() {
|
}
|
|
private static MessageNoticeManager messageNoticeManager;
|
|
public static MessageNoticeManager getInstance() {
|
if (messageNoticeManager == null) {
|
synchronized (MessageNoticeManager.class) {
|
if (messageNoticeManager == null) {
|
messageNoticeManager = new MessageNoticeManager();
|
}
|
}
|
}
|
return messageNoticeManager;
|
}
|
|
public void makeNotification(Context context, String title, String content, String tickerText, int id) {
|
Notification notification = createNotice(context, title, content, tickerText);
|
/**
|
* 手机设置的默认提示音
|
*/
|
// Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
|
|
/**
|
* sound属性是一个 Uri 对象。 可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来.
|
* 如:手机的/system/media/audio/ringtones 目录下有一个 Basic_tone.ogg音频文件,
|
* 可以写成: Uri soundUri = Uri.fromFile(new
|
* File("/system/media/audio/ringtones/Basic_tone.ogg"));
|
*/
|
|
|
/**
|
* vibrate属性是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。
|
* 参数中下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长, 下标为2的值又表示手机静止的时长,以此类推。
|
*/
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
notification.vibrate = null;
|
notification.sound = null;
|
}
|
|
// /**
|
// * 手机处于锁屏状态时, LED灯就会不停地闪烁, 提醒用户去查看手机,下面是绿色的灯光一 闪一闪的效果
|
// */
|
// notification.ledARGB = Color.GREEN;// 控制 LED 灯的颜色,一般有红绿蓝三种颜色可选
|
// notification.ledOnMS = 1000;// 指定 LED 灯亮起的时长,以毫秒为单位
|
// notification.ledOffMS = 1000;// 指定 LED 灯暗去的时长,也是以毫秒为单位
|
// notification.flags = Notification.FLAG_SHOW_LIGHTS;// 指定通知的一些行为,其中就包括显示
|
// // LED 灯这一选项
|
|
/**
|
* 如果不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动
|
*/
|
// notification.defaults = Notification.DEFAULT_ALL;
|
notify(id, notification);
|
}
|
|
public void notify(int id, Notification notification) {
|
manager.notify(id, notification);
|
}
|
|
public void cancel(int id) {
|
manager.cancel(id);
|
}
|
|
private void play(Context context) {
|
// 设置通知出现时的震动(如果 android 设备支持的话)
|
Vibrator vibrator = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
|
vibrator.vibrate(pattern, -1);
|
|
mp = MediaPlayer.create(context, getSystemDefultRingtoneUri(context));
|
try {
|
// mpMediaPlayer.prepare();
|
if (mp.isPlaying()) {
|
mp.stop();
|
mp.release();
|
mp = MediaPlayer.create(context, getSystemDefultRingtoneUri(context));
|
}
|
mp.setVolume(1f, 1f);
|
mp.setLooping(false);
|
mp.start();
|
} catch (IllegalStateException e) {
|
e.printStackTrace();
|
}
|
}
|
|
public Notification createNotice(Context context, RemoteViews remoteViews) {
|
manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
|
AVChatNotificationChannelCompat26.createNIMMessageNotificationChannel(context, manager);
|
/**
|
* 实例化Intent,构建意图:从当前页面条状到NotificationActivity页面
|
*/
|
|
/**
|
* 用于启动活动、启动服务以及发送广播等。 根据需求来选择是使用
|
* getActivity()方法、getBroadcast()方法、还是 getService() 方法。 一共四个参数:
|
* 1)、第一个参数是 上下文Context ; 2)、 第二个参数一般用不到,通常都是传入 0 即可 3)、第三个参数是一个
|
* Intent对象,我们可以通过这个对象构建出 PendingIntent 的“意图”; 4)、第四个参数用于确定
|
* PendingIntent 的行为
|
*/
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, AVChatNotificationChannelCompat26.getNIMChannelId(context));
|
builder.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
.setWhen(System.currentTimeMillis())
|
.setAutoCancel(true)
|
.setSmallIcon(DownloadLibrary.getIc_launcher())
|
.setCustomContentView(remoteViews)
|
.setPriority(Notification.PRIORITY_HIGH)
|
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
return builder.build();
|
}
|
|
public Notification createNotice(Context context, String title, String content, String tickerText) {
|
Class<? extends Activity> entranceActivity = DownloadLibrary.getEntranceActivity();
|
Intent intent = new Intent();
|
if (entranceActivity !=null){
|
intent.setClass(context,entranceActivity);
|
}
|
return createNotice(context, title, content, tickerText, intent);
|
}
|
|
public Notification createNotice(Context context, String title, String content, String tickerText, Intent intent) {
|
manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
|
AVChatNotificationChannelCompat26.createNIMMessageNotificationChannel(context, manager);
|
|
/**
|
* 用于启动活动、启动服务以及发送广播等。 根据需求来选择是使用
|
* getActivity()方法、getBroadcast()方法、还是 getService() 方法。 一共四个参数:
|
* 1)、第一个参数是 上下文Context ; 2)、 第二个参数一般用不到,通常都是传入 0 即可 3)、第三个参数是一个
|
* Intent对象,我们可以通过这个对象构建出 PendingIntent 的“意图”; 4)、第四个参数用于确定
|
* PendingIntent 的行为
|
*/
|
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1,
|
intent, PendingIntent.FLAG_CANCEL_CURRENT);
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, AVChatNotificationChannelCompat26.getNIMChannelId(context));
|
builder.setCategory(NotificationCompat.CATEGORY_MESSAGE)
|
.setTicker(tickerText)
|
.setWhen(System.currentTimeMillis())
|
.setAutoCancel(true)
|
.setSmallIcon(DownloadLibrary.getIc_launcher())
|
.setContentTitle(title)
|
.setContentText(content)
|
.setContentIntent(pendingIntent)
|
.setPriority(Notification.PRIORITY_HIGH)
|
.setVisibility(Notification.VISIBILITY_PUBLIC);
|
return builder.build();
|
}
|
|
//停止播放
|
public void stopRing() {
|
if (mp != null) {
|
if (mp.isPlaying()) {
|
mp.stop();
|
mp.release();
|
}
|
}
|
}
|
|
//获取系统默认铃声的Uri
|
private Uri getSystemDefultRingtoneUri(Context context) {
|
return RingtoneManager.getActualDefaultRingtoneUri(context,
|
RingtoneManager.TYPE_NOTIFICATION);
|
}
|
}
|