为了解决这个问题,我需要创建一个有点复杂的变通方法。但这是可行的。让我解释一下我做了什么。
我首先创建
NotificationListenerService
读取设备中显示的每个通知。
当然,您需要向以下人员申请许可:
startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));
然后,在onNotificationPosted()函数中执行以下操作:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (sbn.getPackageName().equalsIgnoreCase("com.google.android.deskclock")) {
//The Android standard clock app is displaying a notification. We still need to check that the notification is because the alarm is going off right now, and not because the user has set an alarm at a specific time and the system displays de clock icon:
oNotification = sbn.getNotification();
String s1 = "" + oNotification.extras.getCharSequence(Notification.EXTRA_TITLE);
if(s1.equalsIgnoreCase("Alarm") || s1.equalsIgnoreCase("Alarma") || s1.equalsIgnoreCase("Alarme") || s1.equalsIgnoreCase("Sveglia") || s1.equalsIgnoreCase("ÐÑдилÑник") || s1.equalsIgnoreCase("AlarmÄ") || s1.equalsIgnoreCase("اÙÙ
ÙبÙ") || s1.equalsIgnoreCase("Wecker") || s1.equalsIgnoreCase("ÃbresztÅ") || s1.equalsIgnoreCase("Wekker") || s1.equalsIgnoreCase("ÐÑдилÑник") || s1.equalsIgnoreCase("é¹é") || s1.equalsIgnoreCase("鬧é") ) { //En varios idiomas
//Alarm is going off right now!!!!
}
}
}
-
我检查发布的通知是否属于标准的Android闹钟应用程序(com.google.Android.deskclock)。
-
然后,我需要将显示警报设置为特定时间的常规通知与真正的警报关闭通知区分开来。
-
看了几个例子后,我发现当警报响起时,通知中有“alarm”一词。EXTRA\u标题字段。
您需要注意,因为在其他情况下,此字段可能为空或包含文本“待定报警”。但是,当它熄灭时,它只是“警报”。
-
我还将设备的语言更改为主要语言(英语、西班牙语、汉语、法语、德语、俄语…)并查看它可以更改为Alarma、Alarme、Wecker、breszt、§¨、。。。
这有点“模拟”,但由于Android一直在为我们筑墙,我们试图跳过它们。我不明白为什么安卓系统对我们的限制如此之大。如果有权接收警报响起的事件,那就太好了。即使这是一个“危险”的许可。