Я разрабатываю приложение для Android, в котором мне нужно блокировать, а затем повторно публиковать уведомления. Мое приложение успешно блокирует уведомления, но когда я пытаюсь опубликовать их повторно, они не появляются в строке состояния. Я добавил ведение журнала, чтобы подтвердить, что метод репоста вызывается и выполняется без ошибок.
Вот соответствующие части моего кода:
Класс MyNotificationListener:
package com.blissio_ai_frontend
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.util.Log
class MyNotificationListener : NotificationListenerService() {
companion object {
var BLOCK_ALL: Boolean = false
val blockedAppPackages: MutableList = mutableListOf()
private const val TAG = "MyNotificationListener"
val blockedNotifications: MutableList = mutableListOf()
private lateinit var context: Context
fun initialize(context: Context) {
this.context = context
}
}
override fun onNotificationPosted(sbn: StatusBarNotification) {
val notification: Notification = sbn.notification
val packageName: String = sbn.packageName
val title: CharSequence? = notification.extras.getCharSequence(Notification.EXTRA_TITLE)
val text: CharSequence? = notification.extras.getCharSequence(Notification.EXTRA_TEXT)
Log.d(TAG, "Notification from: $packageName, Title: $title, Text: $text")
if (BLOCK_ALL) {
cancelAllNotifications()
Log.d(TAG, "All notifications blocked")
storeBlockedNotification(sbn)
} else {
if (blockedAppPackages.contains(packageName)) {
cancelNotification(sbn.key)
Log.d(TAG, "Notification from $packageName blocked")
storeBlockedNotification(sbn)
}
}
}
override fun onNotificationRemoved(sbn: StatusBarNotification) {
Log.d(TAG, "Notification removed: ${sbn.packageName}")
}
private fun storeBlockedNotification(sbn: StatusBarNotification) {
blockedNotifications.add(sbn)
}
fun getBlockedNotifications(): String {
return blockedNotifications.joinToString(separator = "\n") { sbn ->
val packageName = sbn.packageName
val title = sbn.notification.extras.getCharSequence(Notification.EXTRA_TITLE)
val text = sbn.notification.extras.getCharSequence(Notification.EXTRA_TEXT)
"Package: $packageName, Title: $title, Text: $text"
}
}
fun repostBlockedNotifications() {
Log.d(TAG, "Reposting blocked notifications")
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
"default_channel",
"Default Channel",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
}
blockedNotifications.forEach { sbn ->
val originalNotification = sbn.notification
val repostedNotificationBuilder = Notification.Builder(context)
.setContentTitle(originalNotification.extras.getCharSequence(Notification.EXTRA_TITLE))
.setContentText(originalNotification.extras.getCharSequence(Notification.EXTRA_TEXT))
.setWhen(originalNotification.`when`)
.setShowWhen(true)
.setChannelId(originalNotification.channelId ?: "default_channel")
.setSmallIcon(context.applicationInfo.icon)
.setPriority(Notification.PRIORITY_HIGH)
.setAutoCancel(true)
val repostedNotification = repostedNotificationBuilder.build()
Log.d(TAG, "Reposting notification with ID: ${System.currentTimeMillis().toInt()}")
notificationManager.notify(System.currentTimeMillis().toInt(), repostedNotification)
}
}
}
А это мой модуль уведомлений:
package com.blissio_ai_frontend
import android.util.Log
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.provider.Settings
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
class NotificationModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
private val context: ReactApplicationContext = reactContext
init {
MyNotificationListener.initialize(context)
}
override fun getName(): String {
return "NotificationModule"
}
@ReactMethod
fun openNotificationSettings() {
val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
@ReactMethod
fun setBlockAllNotifications(block: Boolean) {
MyNotificationListener.BLOCK_ALL = block
}
@ReactMethod
fun blockNotificationsForApp(packageName: String, block: Boolean) {
if (block) {
MyNotificationListener.blockedAppPackages.add(packageName)
} else {
MyNotificationListener.blockedAppPackages.remove(packageName)
}
}
@ReactMethod
fun setDoNotDisturb(enable: Boolean, promise: Promise) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (notificationManager.isNotificationPolicyAccessGranted) {
notificationManager.setInterruptionFilter(
if (enable) NotificationManager.INTERRUPTION_FILTER_NONE
else NotificationManager.INTERRUPTION_FILTER_ALL
)
promise.resolve(true)
} else {
promise.reject("PERMISSION_DENIED", "Notification policy access is not granted")
}
}
@ReactMethod
fun getBlockedNotifications(promise: Promise) {
val listener = MyNotificationListener()
val blockedNotifications = listener.getBlockedNotifications()
Log.d("NotificationModule", "Blocked Notifications: $blockedNotifications")
promise.resolve(blockedNotifications)
}
@ReactMethod
fun repostBlockedNotifications(promise: Promise) {
try {
val listener = MyNotificationListener()
listener.repostBlockedNotifications()
promise.resolve(true)
} catch (e: Exception) {
Log.e("NotificationModule", "Error reposting notifications", e)
promise.reject("ERROR_REPOSTING", "Failed to repost notifications")
}
}
}
Это мой код JavaScript:
import React, {useState} from 'react';
import {View, Button, StyleSheet, Text, ScrollView} from 'react-native';
import {NativeModules} from 'react-native';
const {NotificationModule} = NativeModules;
const openNotificationAccessSettings = () => {
NotificationModule.openNotificationAccessSettings();
};
const setDoNotDisturb = (enable: boolean) => {
NotificationModule.setBlockAllNotifications(enable);
console.log('Navigated to notification settings for Facebook.');
};
const getBlockedNotifications = async () => {
try {
const notifications = await NotificationModule.getBlockedNotifications();
console.log('Blocked notifications:', notifications);
// Repost the blocked notifications
const repostResult = await NotificationModule.repostBlockedNotifications();
console.log('Repost result:', repostResult);
} catch (error) {
console.error('Error retrieving or reposting blocked notifications', error);
}
};
const NotificationSettings: React.FC = () => {
const [blockedNotifications, setBlockedNotifications] = useState('');
return (
setDoNotDisturb(true)}
/>
setDoNotDisturb(false)}
/>
{blockedNotifications}
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
scrollView: {
marginTop: 20,
padding: 10,
width: '100%',
},
});
export default NotificationSettings;
Это соответствующий вывод logcat:
All notifications blocked
Notification removed: com.facebook.katana
Reposting blocked notifications
Reposting notification with ID: 1756651103
Notification from: com.google.android.setupwizard, Title: اتمام راهاندازی Xperia™, Text: کپی کردن دادهها، و چند دلیل دیگر
All notifications blocked
Подробнее здесь: https://stackoverflow.com/questions/786 ... ve-modules
Повторная публикация сохраненных уведомлений в React Native с использованием модулей Kotlin Native. ⇐ Android
Форум для тех, кто программирует под Android
1719664523
Anonymous
Я разрабатываю приложение для Android, в котором мне нужно блокировать, а затем повторно публиковать уведомления. Мое приложение успешно блокирует уведомления, но когда я пытаюсь опубликовать их повторно, они не появляются в строке состояния. Я добавил ведение журнала, чтобы подтвердить, что метод репоста вызывается и выполняется без ошибок.
Вот соответствующие части моего кода:
Класс MyNotificationListener:
package com.blissio_ai_frontend
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import android.service.notification.NotificationListenerService
import android.service.notification.StatusBarNotification
import android.util.Log
class MyNotificationListener : NotificationListenerService() {
companion object {
var BLOCK_ALL: Boolean = false
val blockedAppPackages: MutableList = mutableListOf()
private const val TAG = "MyNotificationListener"
val blockedNotifications: MutableList = mutableListOf()
private lateinit var context: Context
fun initialize(context: Context) {
this.context = context
}
}
override fun onNotificationPosted(sbn: StatusBarNotification) {
val notification: Notification = sbn.notification
val packageName: String = sbn.packageName
val title: CharSequence? = notification.extras.getCharSequence(Notification.EXTRA_TITLE)
val text: CharSequence? = notification.extras.getCharSequence(Notification.EXTRA_TEXT)
Log.d(TAG, "Notification from: $packageName, Title: $title, Text: $text")
if (BLOCK_ALL) {
cancelAllNotifications()
Log.d(TAG, "All notifications blocked")
storeBlockedNotification(sbn)
} else {
if (blockedAppPackages.contains(packageName)) {
cancelNotification(sbn.key)
Log.d(TAG, "Notification from $packageName blocked")
storeBlockedNotification(sbn)
}
}
}
override fun onNotificationRemoved(sbn: StatusBarNotification) {
Log.d(TAG, "Notification removed: ${sbn.packageName}")
}
private fun storeBlockedNotification(sbn: StatusBarNotification) {
blockedNotifications.add(sbn)
}
fun getBlockedNotifications(): String {
return blockedNotifications.joinToString(separator = "\n") { sbn ->
val packageName = sbn.packageName
val title = sbn.notification.extras.getCharSequence(Notification.EXTRA_TITLE)
val text = sbn.notification.extras.getCharSequence(Notification.EXTRA_TEXT)
"Package: $packageName, Title: $title, Text: $text"
}
}
fun repostBlockedNotifications() {
Log.d(TAG, "Reposting blocked notifications")
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
"default_channel",
"Default Channel",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
}
blockedNotifications.forEach { sbn ->
val originalNotification = sbn.notification
val repostedNotificationBuilder = Notification.Builder(context)
.setContentTitle(originalNotification.extras.getCharSequence(Notification.EXTRA_TITLE))
.setContentText(originalNotification.extras.getCharSequence(Notification.EXTRA_TEXT))
.setWhen(originalNotification.`when`)
.setShowWhen(true)
.setChannelId(originalNotification.channelId ?: "default_channel")
.setSmallIcon(context.applicationInfo.icon)
.setPriority(Notification.PRIORITY_HIGH)
.setAutoCancel(true)
val repostedNotification = repostedNotificationBuilder.build()
Log.d(TAG, "Reposting notification with ID: ${System.currentTimeMillis().toInt()}")
notificationManager.notify(System.currentTimeMillis().toInt(), repostedNotification)
}
}
}
А это мой модуль уведомлений:
package com.blissio_ai_frontend
import android.util.Log
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.provider.Settings
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
class NotificationModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
private val context: ReactApplicationContext = reactContext
init {
MyNotificationListener.initialize(context)
}
override fun getName(): String {
return "NotificationModule"
}
@ReactMethod
fun openNotificationSettings() {
val intent = Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
@ReactMethod
fun setBlockAllNotifications(block: Boolean) {
MyNotificationListener.BLOCK_ALL = block
}
@ReactMethod
fun blockNotificationsForApp(packageName: String, block: Boolean) {
if (block) {
MyNotificationListener.blockedAppPackages.add(packageName)
} else {
MyNotificationListener.blockedAppPackages.remove(packageName)
}
}
@ReactMethod
fun setDoNotDisturb(enable: Boolean, promise: Promise) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (notificationManager.isNotificationPolicyAccessGranted) {
notificationManager.setInterruptionFilter(
if (enable) NotificationManager.INTERRUPTION_FILTER_NONE
else NotificationManager.INTERRUPTION_FILTER_ALL
)
promise.resolve(true)
} else {
promise.reject("PERMISSION_DENIED", "Notification policy access is not granted")
}
}
@ReactMethod
fun getBlockedNotifications(promise: Promise) {
val listener = MyNotificationListener()
val blockedNotifications = listener.getBlockedNotifications()
Log.d("NotificationModule", "Blocked Notifications: $blockedNotifications")
promise.resolve(blockedNotifications)
}
@ReactMethod
fun repostBlockedNotifications(promise: Promise) {
try {
val listener = MyNotificationListener()
listener.repostBlockedNotifications()
promise.resolve(true)
} catch (e: Exception) {
Log.e("NotificationModule", "Error reposting notifications", e)
promise.reject("ERROR_REPOSTING", "Failed to repost notifications")
}
}
}
Это мой код JavaScript:
import React, {useState} from 'react';
import {View, Button, StyleSheet, Text, ScrollView} from 'react-native';
import {NativeModules} from 'react-native';
const {NotificationModule} = NativeModules;
const openNotificationAccessSettings = () => {
NotificationModule.openNotificationAccessSettings();
};
const setDoNotDisturb = (enable: boolean) => {
NotificationModule.setBlockAllNotifications(enable);
console.log('Navigated to notification settings for Facebook.');
};
const getBlockedNotifications = async () => {
try {
const notifications = await NotificationModule.getBlockedNotifications();
console.log('Blocked notifications:', notifications);
// Repost the blocked notifications
const repostResult = await NotificationModule.repostBlockedNotifications();
console.log('Repost result:', repostResult);
} catch (error) {
console.error('Error retrieving or reposting blocked notifications', error);
}
};
const NotificationSettings: React.FC = () => {
const [blockedNotifications, setBlockedNotifications] = useState('');
return (
setDoNotDisturb(true)}
/>
setDoNotDisturb(false)}
/>
{blockedNotifications}
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
scrollView: {
marginTop: 20,
padding: 10,
width: '100%',
},
});
export default NotificationSettings;
Это соответствующий вывод logcat:
All notifications blocked
Notification removed: com.facebook.katana
Reposting blocked notifications
Reposting notification with ID: 1756651103
Notification from: com.google.android.setupwizard, Title: اتمام راهاندازی Xperia™, Text: کپی کردن دادهها، و چند دلیل دیگر
All notifications blocked
Подробнее здесь: [url]https://stackoverflow.com/questions/78685752/reposting-the-stored-notificaions-in-react-native-using-kotlin-native-modules[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия