@androiddeveloper Да. В моем приемнике я изменил название пойманного уведомления. Но я не нашел способа доставить изменения в строку состояния. Можно изменить пойманное уведомление, удалить исходное и опубликовать пойманное уведомление как свое собственное, но в этом случае возникнут проблемы. Наиболее очевидными являются конфликты идентификаторов, обработка канала уведомлений, и если владелец-приложение попытается обновить исходное уведомление, оно выдаст новое, а не обновление, потому что получатель удалил его, поэтому вы должны обработать его вручную.

нашел приложение, которое каким-то образом скрывает хедз-ап уведомления, включая даже текущие уведомления (используемые службами переднего плана), называемое

NCleanerМне было интересно, как такая вещь работает. .

Проблема

Существует не так много информации о том, как контролировать уведомления других приложений. Только для текущего приложения, и по какой-то причине я не смог отменить текущее уведомление, но мне удалось отменить нормальное.

Что я нашел

я обнаружил

этот образец показывая, как контролировать уведомления. После поиска на документы оNotificationListenerServiceЯ также нашел, как отменить определенные уведомления других приложений.Однако это не работает для текущих уведомлений.

Для проверки обычных уведомлений я просто отправил себе электронное письмо или написал что-то в приложении PushBullet через мой ПК.

Для тестирования текущих уведомлений я установил и запустил свое приложение для свободного времени (

Вот), которое показывает текущее уведомление в самом начале приложения, начиная с Android O. Фактически, оно может даже скрывать уведомления ОС, о подключенном USB и отладке (просто подключите устройство к ПК через USB). ..Вот код, который я сделал на основе примера, чтобы отменить все полученные уведомления:

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) {}
}

MainActivity.kt

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

Вопросы

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"))
        }
    }

}
Почему мой код не может удалить текущие уведомления?Почему приложение, которое я нашел, может это сделать? Что оно делает?Сколько это API предоставляет в плане уведомлений? Глядя на документы, кажется, что он может многое: читать уведомления, отклонять их, получать всевозможную информацию о них, ... Но я не могу найти некоторые другие функции: можно ли изменить уведомление? Чтобы изменить свой приоритет? Чтобы он не был хедз-ап-уведомлением и просто находился в ящике уведомлений? Можно ли вызвать действие уведомления?Может быть, это дремлет неосуществимые или текущие уведомления?

Ответы на вопрос(1)

Ваш ответ на вопрос