Como cancelar uma notificação em andamento de outro aplicativo?
Encontrei um aplicativo que de alguma forma oculta notificações heads-up, incluindo até notificações em andamento (usadas por serviços em primeiro plano), chamadasNCleaner .
Fiquei me perguntando como isso funciona.
O problemaNão há muitas informações sobre como controlar as notificações de outros aplicativos. Somente no aplicativo atual e, por algum motivo, não consegui cancelar uma notificação em andamento, mas consegui cancelar uma notificação normal.
O que eu encontreiencontreiesta amostra mostrando como monitorar as notificações. Depois de pesquisar nos documentos sobreNotificationListenerService, Também descobri como cancelar notificações específicas de outros aplicativos.
No entanto, ele não funciona para notificações em andamento.
Para testar as notificações normais, enviei um email para mim ou escrevi algo no aplicativo PushBullet pelo meu PC.
Para testar as notificações em andamento, instalei e executei meu aplicativo de tempo livre (aqui), que mostra uma notificação em andamento logo no início do aplicativo, a partir do Android O. De fato, ele pode ocultar as notificações do sistema operacional, do USB conectado e da depuração (basta conectar o dispositivo ao PC via USB). ..
Aqui está o código que eu fiz, com base na amostra, para cancelar todas as notificações recebidas:
NotificationListenerExampleService.kt
class NotificationListenerExampleService : NotificationListenerService() {
override fun onNotificationPosted(sbn: StatusBarNotification) {
Log.d("AppLog", "sbn:" + sbn.toString())
cancelNotification(sbn.key)
}
override fun onListenerConnected() {
super.onListenerConnected()
Log.d("AppLog", "onListenerConnected")
}
override fun onNotificationRemoved(sbn: StatusBarNotification) {}
}
manifesto:
<application
android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service
android:name=".NotificationListenerExampleService" android:label="@string/service_label" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService"/>
</intent-filter>
</service>
</application>
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val isNotificationServiceEnabled: Boolean
get() {
val pkgName = packageName
val flat = Settings.Secure.getString(contentResolver, "enabled_notification_listeners"")
if (!TextUtils.isEmpty(flat)) {
val names = flat.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (i in names.indices) {
val cn = ComponentName.unflattenFromString(names[i])
if (cn != null) {
if (TextUtils.equals(pkgName, cn.packageName)) {
return true
}
}
}
}
return false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (!isNotificationServiceEnabled) {
startActivity(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))
}
}
}
As questõesComo meu código não pode remover as notificações em andamento?Como é que o aplicativo que eu encontrei pode fazer isso? O que isso faz?Quanto essa API fornece em termos de notificações? Olhando para os documentos, parece que pode fazer muito: ler notificações, dispensá-las, obter todos os tipos de informações sobre elas, ... Mas não consigo encontrar outros recursos: É possível modificar uma notificação? Mudar sua prioridade? Para evitar que seja uma notificação de alerta e apenas estar na gaveta de notificações? É possível desencadear uma ação de uma notificação?