重构通知栏消息,添加铃声。
This commit is contained in:
parent
13e0ad3f03
commit
bff40d2a64
10
build.gradle
10
build.gradle
@ -1,11 +1,6 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
// 本地 Maven 仓库(默认路径为 ~/.m2/repository)
|
||||
//mavenLocal()
|
||||
// 或自定义本地仓库路径
|
||||
maven { url "file:///sdcard/.m2/repository" }
|
||||
|
||||
// Nexus Maven 库地址
|
||||
// "WinBoLL Release"
|
||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||
@ -31,11 +26,6 @@ buildscript {
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
// 本地 Maven 仓库(默认路径为 ~/.m2/repository)
|
||||
//mavenLocal()
|
||||
// 或自定义本地仓库路径
|
||||
maven { url "file:///sdcard/.m2/repository" }
|
||||
|
||||
// Nexus Maven 库地址
|
||||
// "WinBoLL Release"
|
||||
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
|
||||
|
@ -24,7 +24,7 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "cc.winboll.studio.timestamp"
|
||||
minSdkVersion 24
|
||||
targetSdkVersion 30
|
||||
targetSdkVersion 29
|
||||
versionCode 1
|
||||
// versionName 更新后需要手动设置
|
||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||
|
@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Tue May 06 20:37:48 HKT 2025
|
||||
#Tue May 06 18:34:42 GMT 2025
|
||||
stageCount=7
|
||||
libraryProject=
|
||||
baseVersion=15.0
|
||||
publishVersion=15.0.6
|
||||
buildCount=0
|
||||
buildCount=7
|
||||
baseBetaVersion=15.0.7
|
||||
|
@ -26,7 +26,6 @@ import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
|
||||
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
|
||||
import cc.winboll.studio.timestamp.utils.NotificationHelper;
|
||||
import cc.winboll.studio.timestamp.utils.ServiceUtil;
|
||||
import cc.winboll.studio.timestamp.utils.TimeStampRemoteViewsUtil;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
@ -59,10 +58,9 @@ public class MainService extends Service {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
// 创建 RemoteViews 对象,并使用包含自定义 View 的布局
|
||||
//mRemoteViews = new RemoteViews(getPackageName(), R.layout.remoteviews_timestamp);
|
||||
|
||||
|
||||
mNotificationHelper = new NotificationHelper();
|
||||
mNotificationHelper.createServiceNotificationChannel(this);
|
||||
|
||||
// 创建广播接收器实例
|
||||
mButtonClickReceiver = new ButtonClickReceiver();
|
||||
|
||||
@ -219,7 +217,7 @@ public class MainService extends Service {
|
||||
String szTimeStampFormatString = AppConfigsUtil.getInstance(MainService.this).getAppConfigsModel().getTimeStampFormatString();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(szTimeStampFormatString);
|
||||
String formattedDateTime = ldt.format(formatter);
|
||||
TimeStampRemoteViewsUtil.getInstance(MainService.this).showNotification("时间戳:\n" + formattedDateTime + "\n已拷贝到剪贴板。");
|
||||
mNotificationHelper.sendForegroundNotification(MainService.this, "时间戳:\n" + formattedDateTime + "\n已拷贝到剪贴板。");
|
||||
|
||||
LogUtils.d(TAG, "Hello, World! " + formattedDateTime);
|
||||
break;
|
||||
|
@ -0,0 +1,69 @@
|
||||
package cc.winboll.studio.timestamp.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen
|
||||
* @Date 2025/05/07 02:31
|
||||
* @Describe AudioPlayerUtil
|
||||
*/
|
||||
import android.content.Context;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
public class AudioPlayerUtil {
|
||||
|
||||
public static final String TAG = "AudioPlayerUtil";
|
||||
|
||||
private static MediaPlayer mediaPlayer;
|
||||
|
||||
/**
|
||||
* 播放指定Uri的音频
|
||||
* @param context 上下文
|
||||
* @param audioUri 音频的Uri
|
||||
*/
|
||||
public static void playAudio(Context context, Uri audioUri) {
|
||||
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
|
||||
mediaPlayer.stop();
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
|
||||
try {
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setDataSource(context, audioUri);
|
||||
mediaPlayer.prepare();
|
||||
mediaPlayer.start();
|
||||
|
||||
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
releaseMediaPlayer();
|
||||
}
|
||||
});
|
||||
|
||||
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
|
||||
@Override
|
||||
public boolean onError(MediaPlayer mp, int what, int extra) {
|
||||
Log.e("AudioPlayer", "播放音频时出错: what=" + what + ", extra=" + extra);
|
||||
releaseMediaPlayer();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
releaseMediaPlayer();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放MediaPlayer资源
|
||||
*/
|
||||
private static void releaseMediaPlayer() {
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer.stop();
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,212 +12,184 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.os.Build;
|
||||
import android.graphics.Color;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.widget.RemoteViews;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.timestamp.MainActivity;
|
||||
import cc.winboll.studio.timestamp.MainService;
|
||||
import cc.winboll.studio.timestamp.R;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
|
||||
|
||||
public class NotificationHelper {
|
||||
public static final String TAG = "NotificationHelper";
|
||||
|
||||
// 渠道ID和名称
|
||||
private static final String CHANNEL_ID_FOREGROUND = "foreground_channel";
|
||||
private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service";
|
||||
private static final String CHANNEL_ID_TEMPORARY = "temporary_channel";
|
||||
private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications";
|
||||
public static final String TAG = "NotificationUtil";
|
||||
public static final int ID_MSG_SERVICE = 10000;
|
||||
|
||||
// 通知ID
|
||||
public static final int FOREGROUND_NOTIFICATION_ID = 1001;
|
||||
public static final int TEMPORARY_NOTIFICATION_ID = 2001;
|
||||
static final String szSMSChannelID = "1";
|
||||
|
||||
private final Context mContext;
|
||||
private final NotificationManager mNotificationManager;
|
||||
static final String szServiceChannelID = "0";
|
||||
|
||||
// 示例:维护当前使用的渠道ID列表
|
||||
// 键:渠道ID,值:渠道重要性级别
|
||||
Map<String, Integer> activeChannelConfigs = new HashMap<>();
|
||||
|
||||
public NotificationHelper(Context context) {
|
||||
//static int mNumSendForegroundNotification = 10000;
|
||||
//static int mNumSendSMSNotification = 20000;
|
||||
Context mContext;
|
||||
|
||||
|
||||
public NotificationManager createServiceNotificationChannel(Context context) {
|
||||
mContext = context;
|
||||
mNotificationManager = context.getSystemService(NotificationManager.class);
|
||||
|
||||
// 初始化配置
|
||||
activeChannelConfigs.put(
|
||||
CHANNEL_ID_FOREGROUND,
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
);
|
||||
activeChannelConfigs.put(
|
||||
CHANNEL_ID_TEMPORARY,
|
||||
NotificationManager.IMPORTANCE_DEFAULT
|
||||
);
|
||||
|
||||
createNotificationChannels();
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
private void createNotificationChannels() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
createForegroundChannel();
|
||||
createTemporaryChannel();
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
private void createForegroundChannel() {
|
||||
NotificationChannel channel = new NotificationChannel(
|
||||
CHANNEL_ID_FOREGROUND,
|
||||
CHANNEL_NAME_FOREGROUND,
|
||||
NotificationManager.IMPORTANCE_LOW
|
||||
);
|
||||
channel.setDescription("Persistent service notifications");
|
||||
//创建通知渠道ID
|
||||
String channelId = szServiceChannelID;
|
||||
//创建通知渠道名称
|
||||
String channelName = "Service Message";
|
||||
//创建通知渠道重要性
|
||||
int importance = NotificationManager.IMPORTANCE_MIN;
|
||||
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
|
||||
channel.setSound(null, null);
|
||||
channel.enableVibration(false);
|
||||
mNotificationManager.createNotificationChannel(channel);
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(
|
||||
Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
return notificationManager;
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
private void createTemporaryChannel() {
|
||||
NotificationChannel channel = new NotificationChannel(
|
||||
CHANNEL_ID_TEMPORARY,
|
||||
CHANNEL_NAME_TEMPORARY,
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
);
|
||||
channel.setDescription("Temporary alert notifications");
|
||||
channel.setSound(null, null);
|
||||
channel.enableVibration(true);
|
||||
channel.setVibrationPattern(new long[]{100, 200, 300, 400});
|
||||
channel.setBypassDnd(true);
|
||||
mNotificationManager.createNotificationChannel(channel);
|
||||
public NotificationManager createSMSNotificationChannel(Context context) {
|
||||
//创建通知渠道ID
|
||||
String channelId = szSMSChannelID;
|
||||
//创建通知渠道名称
|
||||
String channelName = "SMS Message";
|
||||
//创建通知渠道重要性
|
||||
int importance = NotificationManager.IMPORTANCE_HIGH;
|
||||
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
|
||||
channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT);
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(
|
||||
Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
return notificationManager;
|
||||
}
|
||||
|
||||
// 显示常驻通知(通常用于前台服务)
|
||||
public Notification showForegroundNotification(Intent intent, String title, String content) {
|
||||
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||
// 创建通知
|
||||
//
|
||||
public void sendForegroundNotification(MainService service, String message) {
|
||||
//创建Notification,传入Context和channelId
|
||||
Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
|
||||
intent.setClass(mContext, MainActivity.class);
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
|
||||
//.setContentTitle(title)
|
||||
.setContentTitle(content)
|
||||
//.setContentText(content)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||
.setOngoing(true)
|
||||
.build();
|
||||
//这里放一个count用来区分每一个通知
|
||||
//intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
|
||||
|
||||
mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
|
||||
return notification;
|
||||
}
|
||||
|
||||
//参数1:context 上下文对象
|
||||
//参数2:发送者私有的请求码(Private request code for the sender)
|
||||
//参数3:intent 意图对象
|
||||
//参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
|
||||
PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, ID_MSG_SERVICE, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
|
||||
// 显示常驻通知(通常用于前台服务)
|
||||
public Notification showCustomForegroundNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
|
||||
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
|
||||
//.setContentTitle(title)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setContent(contentView)
|
||||
.setCustomBigContentView(bigContentView)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID)
|
||||
.setAutoCancel(true)
|
||||
.setOngoing(true)
|
||||
.build();
|
||||
|
||||
mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification);
|
||||
return notification;
|
||||
}
|
||||
|
||||
// 显示临时通知(自动消失)
|
||||
public void showTemporaryNotification(Intent intent, String title, String content) {
|
||||
showTemporaryNotification(intent, TEMPORARY_NOTIFICATION_ID, title, content);
|
||||
}
|
||||
|
||||
// 显示临时通知(自动消失)
|
||||
public void showTemporaryNotification(Intent intent, int notificationID, String title, String content) {
|
||||
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
|
||||
//.setContentTitle(nessageNotificationBean.getTitle())
|
||||
//.setContentText(nessageNotificationBean.getContent())
|
||||
//.setContent(remoteviews)
|
||||
.setWhen(System.currentTimeMillis())
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))
|
||||
.setContentTitle(title)
|
||||
.setContentText(content)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
.setAutoCancel(true)
|
||||
.setVibrate(new long[]{100, 200, 300, 400})
|
||||
//设置红色
|
||||
.setColor(Color.parseColor("#F00606"))
|
||||
.setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher))
|
||||
.setContentIntent(mForegroundPendingIntent)
|
||||
.build();
|
||||
|
||||
mNotificationManager.notify(notificationID, notification);
|
||||
}
|
||||
// 创建 RemoteViews 对象,加载布局
|
||||
RemoteViews remoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
|
||||
|
||||
// 创建自定义布局通知(可扩展)
|
||||
public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) {
|
||||
PendingIntent pendingIntent = createPendingIntent(intent);
|
||||
// 自定义 TextView 的文本
|
||||
remoteViews.setTextViewText(R.id.tv_timestamp, message);
|
||||
// 自定义 TextView 的文本颜色
|
||||
remoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
|
||||
// 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY)
|
||||
.setSmallIcon(R.drawable.ic_launcher)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setContent(contentView)
|
||||
.setCustomBigContentView(bigContentView)
|
||||
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
.setAutoCancel(true)
|
||||
.build();
|
||||
// 创建点击通知后的意图
|
||||
Intent intentMain = new Intent(mContext, MainActivity.class);
|
||||
PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, intentMain, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
// 设置通知的点击事件
|
||||
remoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
|
||||
|
||||
mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification);
|
||||
}
|
||||
|
||||
// 取消所有通知
|
||||
public void cancelAllNotifications() {
|
||||
mNotificationManager.cancelAll();
|
||||
}
|
||||
|
||||
// 取消指定通知
|
||||
public void cancelNotification(int notificationID) {
|
||||
mNotificationManager.cancel(notificationID);
|
||||
}
|
||||
|
||||
// 创建PendingIntent(兼容不同API版本)
|
||||
private PendingIntent createPendingIntent(Intent intent) {
|
||||
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
// flags |= PendingIntent.FLAG_IMMUTABLE;
|
||||
// }
|
||||
return PendingIntent.getActivity(
|
||||
// 创建点击按钮后要发送的广播 Intent
|
||||
Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
|
||||
android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
|
||||
mContext,
|
||||
0,
|
||||
intent,
|
||||
flags
|
||||
broadcastIntent,
|
||||
android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
||||
);
|
||||
|
||||
// 为按钮设置点击事件
|
||||
remoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
|
||||
|
||||
mForegroundNotification.contentView = remoteViews;
|
||||
mForegroundNotification.bigContentView = remoteViews;
|
||||
|
||||
service.startForeground(ID_MSG_SERVICE, mForegroundNotification);
|
||||
|
||||
Uri defaultSmsRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
|
||||
AudioPlayerUtil.playAudio(service, defaultSmsRingtoneUri);
|
||||
}
|
||||
|
||||
// public void sendSMSReceivedMessage(int notificationID, String szPhone, String szBody) {
|
||||
// Intent intent = new Intent(mContext, SMSActivity.class);
|
||||
// intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone);
|
||||
// String szTitle = mContext.getString(R.string.text_smsfrom) + "<" + szPhone + ">";
|
||||
// String szContent = "[ " + szBody + " ]";
|
||||
// showTemporaryNotification(intent, notificationID, szTitle, szContent);
|
||||
// public void sendSMSNotification(Context context, MessageNotificationBean messageNotificationBean) {
|
||||
// NotificationManager notificationManager = (NotificationManager) context.getSystemService(
|
||||
// Context.NOTIFICATION_SERVICE);
|
||||
// /*NotificationManager notificationManager = createSMSNotificationChannel(context);
|
||||
// if (notificationManager == null) {
|
||||
// LogUtils.d(TAG, "createSMSNotificationChannel failed.");
|
||||
// return;
|
||||
// }*/
|
||||
//
|
||||
// //创建Notification,传入Context和channelId
|
||||
// Intent intent = new Intent(context, SMSActivity.class);
|
||||
// intent.putExtra(SMSActivity.EXTRA_PHONE, messageNotificationBean.getPhone());
|
||||
// LogUtils.d(TAG, "sendSMSNotification(...) message.getPhone() is : " + messageNotificationBean.getPhone());
|
||||
// //Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取
|
||||
// //intent.setClass(context, MainActivity.class);
|
||||
// //这里放一个count用来区分每一个通知
|
||||
// //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去
|
||||
//
|
||||
// //参数1:context 上下文对象
|
||||
// //参数2:发送者私有的请求码(Private request code for the sender)
|
||||
// //参数3:intent 意图对象
|
||||
// //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个
|
||||
// PendingIntent mRemindPendingIntent = PendingIntent.getActivity(context, messageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
// Notification mSMSNotification = new Notification.Builder(context, szSMSChannelID)
|
||||
// .setAutoCancel(true)
|
||||
// .setContentTitle(messageNotificationBean.getTitle())
|
||||
// .setContentText(messageNotificationBean.getContent())
|
||||
// .setWhen(System.currentTimeMillis())
|
||||
// .setSmallIcon(R.drawable.ic_launcher)
|
||||
// //设置红色
|
||||
// .setColor(Color.parseColor("#F00606"))
|
||||
// .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
|
||||
// .setContentIntent(mRemindPendingIntent)
|
||||
// .build();
|
||||
//
|
||||
// RemoteViews mrvSMSNotificationView = new RemoteViews(context.getPackageName(), R.layout.remoteview);
|
||||
// mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView1, messageNotificationBean.getTitle());
|
||||
// mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView2, messageNotificationBean.getContent());
|
||||
// mrvSMSNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher);
|
||||
// mSMSNotification.contentView = mrvSMSNotificationView;
|
||||
// mSMSNotification.bigContentView = mrvSMSNotificationView;
|
||||
// notificationManager.notify(messageNotificationBean.getMessageId(), mSMSNotification);
|
||||
// LogUtils.d(TAG, "getMessageId is : " + Integer.toString(messageNotificationBean.getMessageId()));
|
||||
//
|
||||
// }
|
||||
|
||||
public void cleanOldChannels() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
List<NotificationChannel> allChannels = mNotificationManager.getNotificationChannels();
|
||||
for (NotificationChannel channel : allChannels) {
|
||||
LogUtils.d(TAG, "Clean channel : " + channel.getId());
|
||||
if (!activeChannelConfigs.containsKey(channel.getId())) {
|
||||
// 安全删除渠道
|
||||
mNotificationManager.deleteNotificationChannel(channel.getId());
|
||||
LogUtils.d(TAG, String.format("Deleted Channel %s", channel.getId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// public void sendSMSReceivedMessage(Context context, int nMessageId, String szPhone, String szBody) {
|
||||
// String szTitle = context.getString(R.string.text_smsfrom) + "<" + szPhone + ">";
|
||||
// String szContent = "[ " + szBody + " ]";
|
||||
// sendSMSNotification(context, new MessageNotificationBean(nMessageId, szPhone, szTitle, szContent));
|
||||
// }
|
||||
|
||||
// public static void cancelNotification(Context context, int notificationId) {
|
||||
// // 获取 NotificationManager 实例
|
||||
// NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
// // 撤回指定 ID 的通知栏消息
|
||||
// notificationManager.cancel(notificationId);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,132 +0,0 @@
|
||||
package cc.winboll.studio.timestamp.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen
|
||||
* @Date 2025/05/05 21:10
|
||||
* @Describe TimeStampRemoteViewsUtil
|
||||
*/
|
||||
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.widget.RemoteViews;
|
||||
import cc.winboll.studio.timestamp.MainActivity;
|
||||
import cc.winboll.studio.timestamp.R;
|
||||
import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver;
|
||||
|
||||
public class TimeStampRemoteViewsUtil {
|
||||
|
||||
public static final String TAG = "TimeStampRemoteViewsUtil";
|
||||
|
||||
public static final String CHANNEL_ID = "TimeStampChannel";
|
||||
|
||||
static volatile TimeStampRemoteViewsUtil _TimeStampRemoteViewsUtil;
|
||||
Context mContext;
|
||||
NotificationHelper mNotificationHelper;
|
||||
RemoteViews mRemoteViews;
|
||||
Intent mIntentMain;
|
||||
|
||||
|
||||
|
||||
TimeStampRemoteViewsUtil(Context context) {
|
||||
mContext = context;
|
||||
mNotificationHelper = new NotificationHelper(context);
|
||||
//createNotificationChannel();
|
||||
}
|
||||
|
||||
public static synchronized TimeStampRemoteViewsUtil getInstance(Context context) {
|
||||
if (_TimeStampRemoteViewsUtil == null) {
|
||||
_TimeStampRemoteViewsUtil = new TimeStampRemoteViewsUtil(context);
|
||||
}
|
||||
return _TimeStampRemoteViewsUtil;
|
||||
}
|
||||
|
||||
// private void createNotificationChannel() {
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// CharSequence name = "自定义视图通知通道";
|
||||
// String description = "用于展示自定义视图的通知通道";
|
||||
// int importance = NotificationManager.IMPORTANCE_HIGH;
|
||||
// NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
|
||||
// channel.setDescription(description);
|
||||
// NotificationManager notificationManager = mContext.getSystemService(NotificationManager.class);
|
||||
// notificationManager.createNotificationChannel(channel);
|
||||
// }
|
||||
// }
|
||||
|
||||
// public void showNotification(String msg) {
|
||||
// if (mRemoteViews == null) {
|
||||
// // 创建 RemoteViews 对象,加载布局
|
||||
// mRemoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
|
||||
//
|
||||
// }
|
||||
// // 自定义 TextView 的文本
|
||||
// mRemoteViews.setTextViewText(R.id.tv_timestamp, msg);
|
||||
// // 自定义 TextView 的文本颜色
|
||||
// mRemoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
|
||||
// // 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
|
||||
//
|
||||
// // 创建点击通知后的意图
|
||||
// Intent intent = new Intent(mContext, MainActivity.class);
|
||||
// PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
// // 设置通知的点击事件
|
||||
// mRemoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
|
||||
//
|
||||
// // 创建点击按钮后要发送的广播 Intent
|
||||
// Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
|
||||
// android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
|
||||
// mContext,
|
||||
// 0,
|
||||
// broadcastIntent,
|
||||
// android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
||||
// );
|
||||
//
|
||||
// // 为按钮设置点击事件
|
||||
// mRemoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
|
||||
//
|
||||
// // 构建通知
|
||||
// NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, CHANNEL_ID)
|
||||
// .setSmallIcon(android.R.drawable.ic_dialog_info)
|
||||
// .setContent(mRemoteViews)
|
||||
// .setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||
// .setOngoing(true)
|
||||
// .setAutoCancel(true);
|
||||
//
|
||||
// // 显示通知
|
||||
// NotificationManager notificationManager = mContext.getSystemService(NotificationManager.class);
|
||||
// mNotification = builder.build();
|
||||
// notificationManager.notify(1, mNotification);
|
||||
// }
|
||||
|
||||
public void showNotification(String msg) {
|
||||
if (mRemoteViews == null) {
|
||||
// 创建 RemoteViews 对象,加载布局
|
||||
mRemoteViews = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification_layout);
|
||||
}
|
||||
// 自定义 TextView 的文本
|
||||
mRemoteViews.setTextViewText(R.id.tv_timestamp, msg);
|
||||
// 自定义 TextView 的文本颜色
|
||||
mRemoteViews.setTextColor(R.id.tv_timestamp, mContext.getResources().getColor(R.color.colorAccent, null));
|
||||
// 这里虽然不能直接设置字体大小,但可以通过反射等方式尝试(不推荐,且有兼容性问题)
|
||||
|
||||
// 创建点击通知后的意图
|
||||
mIntentMain = new Intent(mContext, MainActivity.class);
|
||||
PendingIntent pendingMainIntent = PendingIntent.getActivity(mContext, 0, mIntentMain, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
// 设置通知的点击事件
|
||||
mRemoteViews.setOnClickPendingIntent(R.id.tv_timestamp, pendingMainIntent);
|
||||
|
||||
// 创建点击按钮后要发送的广播 Intent
|
||||
Intent broadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION);
|
||||
android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(
|
||||
mContext,
|
||||
0,
|
||||
broadcastIntent,
|
||||
android.app.PendingIntent.FLAG_UPDATE_CURRENT
|
||||
);
|
||||
|
||||
// 为按钮设置点击事件
|
||||
mRemoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, pendingIntent);
|
||||
|
||||
mNotificationHelper.showCustomForegroundNotification(mIntentMain, mRemoteViews, mRemoteViews);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user