Повторная публикация сохраненных уведомлений в React Native с использованием модулей Kotlin Native.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Повторная публикация сохраненных уведомлений в React Native с использованием модулей Kotlin Native.

Сообщение 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


Подробнее здесь: https://stackoverflow.com/questions/786 ... ve-modules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»