Como cancelar uma notificação em andamento de outro aplicativo?

fundo

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 problema

Nã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 encontrei

encontreiesta 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?

questionAnswers(1)

yourAnswerToTheQuestion