我创建了一个SMS应用程序,该应用程序是为默认消息传递应用程序的备份而创建的。它在收到消息时向用户显示通知,因此只能在用户认为合适的某些情况下使用。它应该是一个辅助消息传递应用程序,因此不应将其设置为默认值。
有没有办法实现以下功能?
如果用户收到消息并在我的消息传递应用程序中打开消息,那么该应用程序应该查找默认消息传递应用程序是什么并取消通知,以便用户不必在已经响应之后关闭该附加通知他们收到的信息。
17年10月12日
我发现我可以获得默认短信应用的包,如下所示:
Telephony.Sms.getDefaultSmsPackage(context);
有没有办法在提供给定包时取消通知?
17年10月14日
我现在正在使用NotificationListener服务来接收所有发布的通知。我现在看到的问题是,当我收到我要取消的特定通知,并且我在NotificationManager上调用取消时,它不会取消。
notificationManager.cancel(sbn.getTag(), sbn.getId());
我甚至还尝试取消所有活动通知,如下所示,并关闭除默认短信应用程序之外的所有通知。这有什么原因吗?
notificationManager.cancelAll();
17年10月15日
这是我的onNotificationPosted()函数:
@Override
public void onNotificationPosted(StatusBarNotification sbn)
{
super.onNotificationPosted(sbn);
NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (DefaultSMSPackage == null)
DefaultSMSPackage = Telephony.Sms.getDefaultSmsPackage(getApplicationContext());
if (sbn.getPackageName().equals(DefaultSMSPackage))
nManager.cancel(sbn.getTag(), sbn.getId());
}
答案 0 :(得分:1)
使用NotificationListenerService
,您的应用可以跟踪和解除从其他应用发布的Notification
。实施onNotificationPosted()
方法可让您的应用在发布时获得Notification
个,getActiveNotifications()
方法可让您访问其他任何可见的Notification
在Service
生命期内指出。
如果您想解雇Notification
,则会调用NotificationListenerService
cancelNotification()
方法之一。如果您在21之前支持Android版本,请确保为版本使用适当的重载。在21之前,您需要使用cancelNotification(String pkg, String tag, int id)
。从21开始,cancelNotification(String key)
是要使用的,而另一个则在targetSdkVersion
为21 +时不起作用。
要激活NotificationListenerService
,用户必须在设备设置中手动启用它。该设置的确切位置因Android版本而异,可能与某些制造商有关,因此如果您的应用可以为该用户打开该页面,将会很有帮助。 Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS
是Intent
您可以与startActivity()
一起使用的resolveActivity()
操作。正如文档所述:
在某些情况下,匹配的活动可能不存在,因此请确保您不会受到此保护。
您可以通过检查Intent
上调用的ActivityNotFoundException
未返回null,或者可能通过捕获startActivity()
可能抛出的expect
来执行此操作。