Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用
Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用
Flutter插件,该插件使用了Truecaller的Android SDK来提供移动号码验证服务以验证Truecaller用户。
当前,该插件仅支持Android。从v0.0.2及以上版本开始,您可以验证Truecaller用户以及非Truecaller用户。而v0.0.1版本仅允许验证那些在其设备上安装了Truecaller应用并且已登录的用户。 通过Truecaller SDK,您可以快速验证、注册或登录您的用户,使用他们的手机号码进行验证。
更多详细信息,请参阅这里。
集成步骤
1. 更新pubspec.yaml
在您的pubspec.yaml
文件中添加最新版本的flutter_truecaller_sdk
:
dependencies:
...
flutter_truecaller_sdk: ^0.0.1
...
2. 生成应用密钥并将其添加到AndroidManifest.xml
- 注册Truecaller开发者账户,或者登录现有账户。
- 参考官方文档生成应用密钥。
- 打开您的
AndroidManifest.xml
文件,并在application
元素中添加一个meta-data
元素,包含您的应用密钥:
<application>
...
<activity>
..
</activity>
<meta-data android:name="com.truecaller.android.sdk.PartnerKey" android:value="PASTE_YOUR_PARTNER_KEY_HERE"/>
...
</application>
3. 修改MainActivity.kt
- 转到
/android
模块下的MainActivity.kt
文件。 - SDK需要使用
FragmentActivity
而不是Activity
,因此将MainActivity.kt
扩展为FlutterFragmentActivity
。 - 在
MainActivity.kt
中覆盖两个函数configureFlutterEngine(flutterEngine: FlutterEngine)
和getBackgroundMode()
:
class MainActivity: FlutterFragmentActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
override fun getBackgroundMode(): FlutterActivityLaunchConfigs.BackgroundMode {
return FlutterActivityLaunchConfigs.BackgroundMode.transparent
}
}
- 在
AndroidManifest.xml
中更新MainActivity.kt
的launchMode
为singleTask
:
<application>
...
<activity android:name=".MainActivity"
android:launchMode="singleTask">
..
</activity>
...
</application>
4. 添加必要的权限到AndroidManifest.xml
如果初始化SDK时使用TruecallerSdkScope.SDK_OPTION_WITH_OTP
,则必须添加以下权限:
对于Android 8及以上版本:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
对于Android 7及以下版本:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
这些权限是SDK能够自动检测挂断电话并完成验证流程所必需的。
要了解有关用户验证的不同场景,请点击这里。
示例 1(仅验证拥有Truecaller应用的Truecaller用户)
// This Example is valid for flutter_truecaller_sdk 0.0.1 onwards
// 导入包
import 'package:flutter_truecaller_sdk/flutter_truecaller_sdk.dart';
// 步骤1: 使用SDK_OPTION_WITHOUT_OTP初始化SDK
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP);
// 步骤2: 检查SDK是否可用
bool isUsable = await TruecallerSdk.isUsable;
// 步骤3: 如果isUsable为true,则可以调用getProfile以显示同意屏幕验证用户的号码
isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
// 或者您也可以直接替换步骤2和步骤3
TruecallerSdk.isUsable.then((isUsable) {
isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});
// 步骤4: 监听TruecallerSdk.getProfile回调结果(成功、失败、验证)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
switch (truecallerSdkCallback.result) {
case TruecallerSdkCallbackResult.success:
print("First Name: ${truecallerSdkCallback.profile.firstName}");
print("Last Name: ${truecallerSdkCallback.profile.lastName}");
break;
case TruecallerSdkCallbackResult.failure:
print("Error code : ${truecallerSdkCallback.error.code}");
break;
case TruecallerSdkCallbackResult.verification:
print("Verification Required!!");
break;
default:
print("Invalid result");
}
});
// 步骤5: 释放streamSubscription
@override
void dispose() {
if (streamSubscription != null) {
streamSubscription.cancel();
}
super.dispose();
}
示例 2(验证Truecaller用户(示例1)和非Truecaller用户(手动验证))
// This Example is valid for flutter_truecaller_sdk 0.0.2 onwards
// 导入包
import 'package:flutter_truecaller_sdk/flutter_truecaller_sdk.dart';
// 步骤1: 使用SDK_OPTION_WITH_OTP初始化SDK
TruecallerSdk.initializeSDK(sdkOptions: TruecallerSdkScope.SDK_OPTION_WITH_OTP);
// 步骤2: 调用getProfile以显示同意屏幕验证用户的号码
// 注意:当使用SDK_OPTION_WITH_OTP时,isUsable总是返回TRUE,所以可以直接调用getProfile
TruecallerSdk.isUsable.then((isUsable) {
isUsable ? TruecallerSdk.getProfile : print("***Not usable***");
});
// 步骤3: 通过[streamCallbackData]流监听TruecallerSdk.getProfile回调结果(成功、失败、验证)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
switch (truecallerSdkCallback.result) {
case TruecallerSdkCallbackResult.success:
// 如果Truecaller用户且其设备上有Truecaller应用,您会直接获得个人资料
print("First Name: ${truecallerSdkCallback.profile.firstName}");
print("Last Name: ${truecallerSdkCallback.profile.lastName}");
break;
case TruecallerSdkCallbackResult.failure:
print("Error code : ${truecallerSdkCallback.error.code}");
break;
case TruecallerSdkCallbackResult.verification:
// 如果回调在这里,表示需要手动验证,因此请遵循步骤4
// 您会收到一个可空错误,可用于确定导致验证的用户操作
print("Manual Verification Required!! ${truecallerSdkCallback.error != null ?
truecallerSdkCallback.error.code : ""}");
break;
default:
print("Invalid result");
}
});
// 步骤4: 通过请求用户输入手机号码发起手动验证
TruecallerSdk.requestVerification(phoneNumber: "PHONE_NUMBER");
// 步骤5: 通过[streamCallbackData]流监听TruecallerSdk.requestVerification回调结果(错过通话发起、错过通话接收、OTP发起、OTP接收、已验证、验证完成、异常)
StreamSubscription streamSubscription = TruecallerSdk.streamCallbackData.listen((truecallerSdkCallback) {
switch (truecallerSdkCallback.result) {
case TruecallerSdkCallbackResult.missedCallInitiated:
// 号码验证将通过漏接电话完成,所以您可以显示加载器直到收到电话
// 您还会收到ttl(秒),它决定了完成用户验证所需的时间
// TTL到期后,您需要重新开始验证过程,可以从步骤4开始
// 您可以让用户输入另一个号码,或者可以通过提供重试按钮自动重试同一号码上的验证
print("${truecallerUserCallback.ttl}");
break;
case TruecallerSdkCallbackResult.missedCallReceived:
// 收到了漏接电话,现在您可以按照步骤6a完成验证
break;
case TruecallerSdkCallbackResult.otpInitiated:
// 号码验证将通过OTP完成
// 您还会收到ttl(秒),它决定了完成用户验证所需的时间
// TTL到期后,您需要重新开始验证过程,可以从步骤4开始
// 您可以让用户输入另一个号码,或者可以通过提供重试按钮自动重试同一号码上的验证
print("${truecallerUserCallback.ttl}");
break;
case TruecallerSdkCallbackResult.otpReceived:
// 已经收到OTP,现在您可以按照步骤6b完成验证
// 如果SMS Retriever哈希码已配置在Truecaller的开发者仪表板上,您可以从回调中获取OTP
print("${truecallerUserCallback.otp}");
break;
case TruecallerSdkCallbackResult.verificationComplete:
// 号码验证已完成,您可以从回调中获取accessToken
print("${truecallerUserCallback.accessToken}");
break;
case TruecallerSdkCallbackResult.verifiedBefore:
// 号码已在此之前验证过,因此无需验证。从回调中检索个人资料数据
print("${truecallerUserCallback.profile.firstName}");
print("${truecallerUserCallback.profile.lastName}");
print("${truecallerUserCallback.profile.accessToken}");
break;
case TruecallerSdkCallbackResult.exception:
// 处理异常
print("${truecallerUserCallback.exception.code}, ${truecallerUserCallback.exception.message}");
break;
default:
print("Invalid result");
}
});
// 步骤6: 完成用户验证
// 6a: 如果在同一设备上收到了漏接电话,调用此方法并传入用户的名字
TruecallerSdk.verifyMissedCall("FIRST_NAME", "LAST_NAME");
// 6b: 如果在任何设备上发起了或收到了OTP,调用此方法并传入用户的名字和接收到的OTP
TruecallerSdk.verifyOtp("FIRST_NAME", "LAST_NAME", "OTP");
// 步骤7: 释放streamSubscription
@override
void dispose() {
if (streamSubscription != null) {
streamSubscription.cancel();
}
super.dispose();
}
如步骤5所述,当TruecallerSdkCallbackResult
等于TruecallerSdkCallbackResult.missedCallInitiated
或TruecallerSdkCallbackResult.otpInitiated
时,您会收到额外的参数TTL(以秒为单位),它作为String extra传递并在回调中使用truecallerUserCallback.ttl
检索。该值确定了完成用户验证所需的剩余时间。您可以使用该值向用户显示等待消息,以便在他们尝试进行另一次尝试之前等待。一旦TTL到期,您需要从步骤4开始重新启动验证过程。
注意事项
自定义选项
语言
要自定义同意屏幕的语言,可以在调用TruecallerSdk.getProfile
之前添加以下行:
/// 初始化SDK并检查isUsable,然后再调用此方法
/// 默认值为"en",即英语
TruecallerSdk.setLocale("hi") // 这将设置语言为印地语
暗主题
您还可以通过添加以下行来自定义同意屏幕的暗主题:
/// 初始化SDK并检查isUsable,然后再调用此方法
TruecallerSdk.setDarkTheme
注意:暗主题不适用于TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET
。
同意屏幕UI
您可以使用类TruecallerSdkScope
下scope_options.dart
中的选项来自定义同意屏幕UI,并在初始化SDK时传递它们。
/// [sdkOptions] 确定您想要使用SDK来验证
/// 1. [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] 即仅限Truecaller用户
/// 2. [TruecallerSdkScope.SDK_OPTION_WITH_OTP] 即Truecaller用户和非Truecaller用户
///
/// 注意:在flutter_truecaller_sdk 0.0.1中,仅支持
/// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP]
/// 在flutter_truecaller_sdk 0.0.2及以后版本中,同时支持
/// [TruecallerSdkScope.SDK_OPTION_WITHOUT_OTP] 和 [TruecallerSdkScope.SDK_OPTION_WITH_OTP]
///
/// [consentMode] 确定您想向用户显示哪种类型的同意屏幕。
/// [consentTitleOptions] 仅适用于 [TruecallerSdkScope.CONSENT_MODE_POPUP] 和 [TruecallerSdkScope.CONSENT_MODE_FULLSCREEN],并设置标题前缀
/// [footerType] 确定底部按钮文本。您可以将其设置为
/// [TruecallerSdkScope.FOOTER_TYPE_NONE] 如果不想显示任何底部按钮
/// 对于 [TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET] 有一些仅适用的定制选项
/// 包括:
/// [loginTextPrefix] 确定登录句子的前缀文本
/// [loginTextSuffix] 确定登录句子的后缀文本
/// [ctaTextPrefix] 确定登录按钮的前缀文本
/// [privacyPolicyUrl] 设置您自己的隐私政策URL
/// [termsOfServiceUrl] 设置您自己的服务条款URL
/// [buttonShapeOptions] 设置登录按钮形状
/// [buttonColor] 设置登录按钮颜色
/// [buttonTextColor] 设置登录按钮文本颜色
static initializeSDK(
{@required int sdkOptions,
int consentMode: TruecallerSdkScope.CONSENT_MODE_BOTTOMSHEET,
int consentTitleOptions: TruecallerSdkScope.SDK_CONSENT_TITLE_GET_STARTED,
int footerType: TruecallerSdkScope.FOOTER_TYPE_SKIP,
int loginTextPrefix: TruecallerSdkScope.LOGIN_TEXT_PREFIX_TO_GET_STARTED,
int loginTextSuffix: TruecallerSdkScope.LOGIN_TEXT_SUFFIX_PLEASE_LOGIN,
int ctaTextPrefix: TruecallerSdkScope.CTA_TEXT_PREFIX_USE,
String privacyPolicyUrl: "",
String termsOfServiceUrl: "",
int buttonShapeOptions: TruecallerSdkScope.BUTTON_SHAPE_ROUNDED,
int buttonColor,
int buttonTextColor})
更多关于Flutter集成Truecaller功能插件flutter_truecaller_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html