@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 предоставляет в плане уведомлений? Глядя на документы, кажется, что он может многое: читать уведомления, отклонять их, получать всевозможную информацию о них, ... Но я не могу найти некоторые другие функции: можно ли изменить уведомление? Чтобы изменить свой приоритет? Чтобы он не был хедз-ап-уведомлением и просто находился в ящике уведомлений? Можно ли вызвать действие уведомления?Может быть, это дремлет неосуществимые или текущие уведомления?