我正在使用 Agora 在我的应用程序中实现视频通话,并使用这个 flutter_callkit_incoming 向用户显示来电。
我的流程是:当有电话打来时,它会收到来自 FCM 的通知,并显示 Flutter 来电呼叫套件通知。当应用程序位于前台和后台时(未从应用程序切换器终止),流程绝对正常。
当应用程序终止时,FCM 会发送呼叫通知,但无法触发呼叫套件发起来电。我需要在应用程序终止时触发呼叫套件。
有什么办法可以做到吗?
有人遇到过类似问题并解决了吗?
这里是FCM后台Handler 当应用程序在后台但未终止时,这绝对可以正常工作,但当应用程序终止时,它无法触发 CallKit。
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
String docName = '';
String docImage = '';
String uuid = '';
dev.log('Message !also contained a notification: ${message.notification}');
if (message.data['type'] == 'call') {
PermissionRequestHandler.requestCameraAndMicPermissionsForCalling();
docName = message.data['doc_name'];
docImage = message.data['doc_image'];
uuid = message.data['uuid'];
logger.d('docName: $docName');
logger.d('docImage: $docImage');
showCallkitIncoming(docName, docImage, uuid);
}
}
触发callkit的函数
Future<void> showCallkitIncoming(
String docName, String docImage, String uuid) async {
final params = CallKitParams(
id: uuid,
nameCaller: docName,
appName: 'AppName',
avatar: docImage,
type: 0,
textAccept: 'Accept',
textDecline: 'Decline',
duration: 30000,
missedCallNotification: const NotificationParams(isShowCallback: false),
android: const AndroidParams(
backgroundColor: '#2E2727',
isCustomNotification: true,
isShowLogo: false,
isShowFullLockedScreen: true,
ringtonePath: 'system_ringtone_default',
),
ios: const IOSParams(
iconName: 'Getfit',
supportsVideo: false,
audioSessionMode: 'default',
audioSessionActive: true,
audioSessionPreferredSampleRate: 44100.0,
audioSessionPreferredIOBufferDuration: 0.005,
supportsDTMF: true,
supportsHolding: false,
supportsGrouping: false,
supportsUngrouping: false,
ringtonePath: 'system_ringtone_default',
));
await FlutterCallkitIncoming.showCallkitIncoming(params);
}
这是应用程序终止且 FCM 收到呼叫通知时的错误日志。它没有触发 callkit 来电通知,而是记录了这个
I/flutter (21552): FlutterFire Messaging: An error occurred in your background messaging handler:
I/flutter (21552): PlatformException(java.lang.Exception: Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly., Exception, Cause: null, Stacktrace: java.lang.Exception: Failed to load FirebaseOptions from resource. Check that you have defined values.xml correctly.
I/flutter (21552): at io.flutter.plugins.firebase.core.i.v(Unknown Source:12)
I/flutter (21552): at io.flutter.plugins.firebase.core.i.l(Unknown Source:0)
I/flutter (21552): at io.flutter.plugins.firebase.core.b.run(Unknown Source:4)
I/flutter (21552): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
I/flutter (21552): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
I/flutter (21552): at java.lang.Thread.run(Thread.java:1012)
I/flutter (21552): , null)
您正在像这样初始化 Firebase:
await Firebase.initializeApp();
如果您按照有关 将 Firebase 添加到您的应用程序的文档进行操作,它实际上看起来像这样:
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
这两种初始化 Firebase 的方法都是有效的,但后一种代码从
firebase_options.dart
文件夹中的 lib
文件中读取值,而前者从 google_services.json
文件中读取值。因此,您必须确保 google_services.json
文件是最新的,可以从 Firebase 控制台下载该文件并将其放在正确的位置,或者通过 (重新)运行 flutterfire configure
。