Журнал моих 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)
}
}
Код: Выделить всё
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
)
}
}
Код: Выделить всё
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);
Код: Выделить всё
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")
}
}
}
Я подозреваю, что это было время задержки между запуском службы переднего плана и вызовом безголовой задачи. Но это было не так.
Я надеялся, что смогу запустить обезглавленную задачу на переднем плане, когда приложение изначально не запускалось. По сути, CallScreening запускает службу переднего плана для запуска приложения.
Подробнее здесь: https://stackoverflow.com/questions/790 ... m-native-s
Мобильная версия