Задача Headless JS в React Native JS не запускается, хотя вызывается из службы NativeAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Задача Headless JS в React Native JS не запускается, хотя вызывается из службы Native

Сообщение Anonymous »

Я пытаюсь вызвать задачу Headless, запускаемую CallScreeningService, передавая входящий номер в Headless.js, который обрабатывает данные. Это также активировало службу приоритетного плана для моего приложения RN.
Журнал моих CallScreeningService.kt и CallHeadlessService.kt регистрируется в logcat, что указывает на его работу. Моя служба переднего плана также работает. Но почему-то Headless.js не запускается.
Это мой CallScreeningService.kt

Код: Выделить всё

@RequiresApi(Build.VERSION_CODES.N)
class CallScreeningService: CallScreeningService() {
@SuppressLint("VisibleForTests")
@RequiresApi(Build.VERSION_CODES.Q)
override fun onScreenCall(callDetails: Call.Details) {
Log.d("Call_Receiver", "[SERVICE] Fetching caller number")
val incomingNum = callDetails.handle.schemeSpecificPart
Log.d("Call_Receiver", "[SERVICE] Incoming call from: $incomingNum")

val intentForeground = Intent(this, CallForegroundService::class.java)
startService(intentForeground)
Log.d("Call_Receiver", "[FOREGROUND] Service called")

val intent = Intent(this, CallHeadlessService::class.java)
intent.putExtra("incomingNumber", incomingNum)
this.startService(intent)

HeadlessJsTaskService.acquireWakeLockNow(this)
Log.d("Call_Receiver", "[MODULE] Headless task waking up")

val response = CallResponse.Builder()
.setDisallowCall(false)
.setSilenceCall(false)
.build()

respondToCall(callDetails, response)
}
}
Это мой CallHeadlessService.kt

Код: Выделить всё

package com.dev.justcall

import android.content.Intent
import android.util.Log
import com.facebook.react.HeadlessJsTaskService
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap
import com.facebook.react.jstasks.HeadlessJsTaskConfig

class CallHeadlessService : HeadlessJsTaskService() {
override fun getTaskConfig(intent: Intent?): HeadlessJsTaskConfig {
Log.d("Call_Receiver", "[HEADLESS] Task called")
val incomingNumber = intent?.getStringExtra("incomingNumber") ?: ""
Log.d("Call_Receiver", "[HEADLESS] Incoming Number: $incomingNumber")
val taskData: WritableMap = Arguments.createMap()
taskData.putString("incomingNumber", incomingNumber)
Log.d("Call_Receiver", "[HEADLESS] Task Data: $taskData")

return HeadlessJsTaskConfig(
"IncomingCallTask",
taskData,
0,
true
)
}
}
Это мой Headless.js

Код: Выделить всё

import { AppRegistry, NativeModules } from "react-native";

//Import Javascript components
import CallerID from "./CallerID";
import CleanPhoneNumber from "./CleanPhoneNumber";
import StartPage from "../../app";
import { name as appName } from '../../app.json';

const { CallNativeModule } = NativeModules;

const handleIncomingCallTask = async (taskData) => {
const { incomingNumber } = taskData;

console.log('[HEADLESS] Task received incoming number:', incomingNumber);

//Get wallet connection status and provider
const { walletSigner } = global.appData;

if (walletSigner) {
console.log('[HEADLESS] User logged in');
try {
const cleanedPhoneNumber = await CleanPhoneNumber(incomingNumber);

const profile = await CallerID(cleanedPhoneNumber, walletSigner);

const name = profile[0];
CallNativeModule.receiveCallerID(name, cleanedPhoneNumber);
console.log('[HEADLESS] Caller ID sent to Native Module');
} catch (error) {
if (error.message.includes('[HEADLESS] Invalid phone number length.')) {
console.log('[HEADLESS] Invalid phone number length.');
} else if (error.message.includes('[HEADLESS] Phone number is not registered')) {
console.log('[HEADLESS] Phone number is not registered.');
} else {
console.log('[HEADLESS] Error:', error);
};
};
} else {
console.log('[HEADLESS] User not logged in');
};
};

console.log('[HEADLESS] App starting...');
AppRegistry.registerComponent(appName, () => StartPage);
AppRegistry.registerHeadlessTask('IncomingCallTask', () =>  handleIncomingCallTask);
Это мой CallForegroundService.kt

Код: Выделить всё

package com.dev.justcall

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat

class CallForegroundService : Service() {
private val channelID = "CallServiceChannel"

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("Call_Receiver", "[FOREGROUND] Setting up")

createNotificationChannel()

val notification = NotificationCompat.Builder(this, channelID)
.setContentTitle("Call Service")
.setContentText("JustCall is active")
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build()

startForeground(1, notification)
Log.d("Call_Receiver", "[FOREGROUND] Service started")

return START_STICKY
}

override fun onBind(intent: Intent?): IBinder? {
return null
}

private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val serviceChannel = NotificationChannel(
channelID,
"Caller ID Active",
NotificationManager.IMPORTANCE_HIGH
)
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(serviceChannel)
Log.d("Call_Receiver", "[FOREGROUND] Notification channel created")
}
}
}
Проблема возникает только при запуске службы переднего плана. Безголовая задача выполнялась идеально при открытии приложения RN.
Я подозреваю, что это было время задержки между запуском службы переднего плана и вызовом безголовой задачи. Но это было не так.
Я надеялся, что смогу запустить обезглавленную задачу на переднем плане, когда приложение изначально не запускалось. По сути, CallScreening запускает службу переднего плана для запуска приложения.

Подробнее здесь: https://stackoverflow.com/questions/790 ... m-native-s
Ответить

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

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

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

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

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