打开视频通话颤动

时间:2020-01-21 00:35:12

标签: flutter dart

是否存在一种解决方案,可以在本地电话上快速打开视频通话功能?我看过Agora和其他产品,但它们都无法按照我们需要的方式工作。

1 个答案:

答案 0 :(得分:6)

这很烦人,研究起来并想出了办法。这是我能想到的最好的方法,同时又保持了解决方案之外的高复杂性和付费SDK。

首先,您必须在发起视频通话之前区分两个平台(iOS / Android)。由于两种平台AFAIK都没有统一的解决方案。

import 'dart:io';

if (Platform.isAndroid) {
  // Android Video Call
} else if (Platform.isIOS) {
  // iOS Video Call
}

iOS

  • 安装臭名昭著的url_launcher酒吧。
  • 您需要使用FaceTime Links(请参阅完整的iOS URL方案参考herehere
  • 文本示例:facetime:14085551234将启动FaceTime视频通话至 14085551234 (您也使用电子邮件代替电话号码)
import 'package:url_launcher/url_launcher.dart';

final String url = 'facetime:$phoneNumber';
if (await canLaunch(url)) {
  await launch(url);
} else {
  throw 'Could not launch $url';
}

这出奇地好。在这种情况下,您可以将$phoneNumber变量替换为$userEmail变量。

Android

这就是问题所在...我尝试了以下解决方案,它仅适用于常规通话而不适用于视频通话

import 'package:android_intent/android_intent.dart';


/// This acton calls the user directly via native phone app but requires `CALL_PHONE` permission in _AndroidManifest_.
final callIntentAction = 'android.intent.action.CALL';

/// This action displays native phone app with dial pad open showing the passed phone number intent's argument/extra. Does not require permissions as of Jan2020.
final dialIntentAction = 'android.intent.action.DIAL'; 

final intentAction = callIntentAction;

AndroidIntent intent = AndroidIntent(
    action: intentAction,
    data: Uri.encodeFull('tel:$phoneNumber'),
    arguments: {
        /// KEY: actual phone number to call [source](https://developer.android.com/reference/android/content/Intent.html#EXTRA_PHONE_NUMBER)
        /// VALUE: phoneNumber
        'android.intent.extra.PHONE_NUMBER': phoneNumber,

        /// KEY: [START_CALL_WITH_VIDEO_STATE](https://developer.android.com/reference/android/telecom/TelecomManager.html#EXTRA_START_CALL_WITH_VIDEO_STATE)
        /// VALUE: `3` implies [STATE_BIDIRECTIONAL](https://developer.android.com/reference/android/telecom/VideoProfile.html#STATE_BIDIRECTIONAL)
        'android.telecom.extra.START_CALL_WITH_VIDEO_STATE': '3',
    },
);
await intent.launch();

错误处理注释:不幸的是,对于 android_intent pub,没有错误处理或像 url_launcher 这样的“ canOpen”方法。

您的问题仍然在于Android作为there's no native通用视频通话应用。

您有两种选择:

  • A。。您可以将第三方或您自己的视频通话SDK /功能与您的应用程序链接。 (例如 flutter_webrtc agora_flutter_webrtc SightCall quickblox)。不利之处在于被调用者必须使用相同的软件,即您的应用必须安装在被调用者的设备上。这种方法更具前瞻性。请注意,我不隶属于我提到的任何库。
  • B。。您可以为Android创建一种平台方法,以遍历已定义的一组意图,并使用所需的额外/参数来检查已知视频通话应用程序的程序包名称。您必须一一检查意向列表,然后查看哪些适用并正确解决。对于 {Google Duo Whatsapp Skype 等应用。...这极易出错。如here所述。