Android SDK 整合指南
概述
MTVerify Android SDK 是一款手機號碼認證 SDK,提供快速、安全的電信業者等級手機號碼驗證服務。
主要功能
- SDK 初始化:透過 AppKey 自動取得設定並初始化
- 覆蓋檢查:檢查目前網路環境是否支援認證服務
- 號碼認證:發起手機號碼認證,取得認證 Token
系統需求
- Android 5.0(API 21)及以上
- 使用者裝置已啟用行動網路
整合指南
權限設定
aar 套件申請了以下權限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
此代碼塊在浮窗中顯示
電信業者設定
由於電信業者介面需使用 HTTP 明文傳輸,需要在應用程式的 AndroidManifest.xml 中設定網路安全策略:
<application
android:networkSecurityConfig="@xml/mtverify_network_security_config"
...>
...
</application>
<application
android:networkSecurityConfig="@xml/mtverify_network_security_config"
...>
...
</application>
此代碼塊在浮窗中顯示
同時需要將 mtverify_network_security_config.xml 檔案複製到應用程式的 res/xml/ 目錄下,請在您下載的安裝套件中找到該檔案。
方法列表
- setLogEnable - 設定日誌開關
- init - 初始化 SDK
- checkCoverage - 檢查覆蓋範圍
- startAuthentication - 執行認證
init
初始化 MTVerify SDK,設定應用程式金鑰與環境設定。
方法簽章
@JvmStatic
fun init(
context: Context,
appkey: String,
environment: IPEnvironment = IPEnvironment.PRODUCTION,
callback: InitCallback? = null
)
@JvmStatic
fun init(
context: Context,
appkey: String,
environment: IPEnvironment = IPEnvironment.PRODUCTION,
callback: InitCallback? = null
)
此代碼塊在浮窗中顯示
參數說明
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
| context | Context | 是 | Android 內容物件 |
| appkey | String | 是 | 應用程式金鑰,用於識別應用程式 |
| environment | IPEnvironment | 否 | 環境類型,預設為 SANDBOX。可選值: - IPEnvironment.SANDBOX:測試/沙箱環境 - IPEnvironment.PRODUCTION:正式環境 |
| callback | InitCallback? | 否 | 初始化回呼介面,用於接收初始化結果 |
回傳值
無
回呼結果
透過 InitCallback.onComplete(result: InitResult) 回傳初始化結果:
data class InitResult(
val code: Int, // 狀態碼,0 代表成功,其他數字代表失敗
val message: String? // 訊息(成功或錯誤訊息)
)
data class InitResult(
val code: Int, // 狀態碼,0 代表成功,其他數字代表失敗
val message: String? // 訊息(成功或錯誤訊息)
)
此代碼塊在浮窗中顯示
使用範例
MTVerifyApi.init(
context = this,
appkey = "your_app_key",
environment = IPEnvironment.PRODUCTION,
callback = object : InitCallback {
override fun onComplete(result: InitResult) {
if (result.code == 0) {
// 初始化成功
Log.d("MTVerify", "初始化成功: ${result.message}")
} else {
// 初始化失敗
Log.e("MTVerify", "初始化失敗: ${result.message}")
}
}
}
)
MTVerifyApi.init(
context = this,
appkey = "your_app_key",
environment = IPEnvironment.PRODUCTION,
callback = object : InitCallback {
override fun onComplete(result: InitResult) {
if (result.code == 0) {
// 初始化成功
Log.d("MTVerify", "初始化成功: ${result.message}")
} else {
// 初始化失敗
Log.e("MTVerify", "初始化失敗: ${result.message}")
}
}
}
)
此代碼塊在浮窗中顯示
注意事項
- 必須先呼叫
init()方法初始化 SDK,才能使用其他功能 - 初始化過程會透過 HTTP 請求取得
clientId與redirectUrl,需要網路連線
setLogEnable
設定日誌開關,控制 SDK 的日誌輸出。
方法簽章
@JvmStatic
fun setLogEnable(enable: Boolean)
@JvmStatic
fun setLogEnable(enable: Boolean)
此代碼塊在浮窗中顯示
參數說明
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
| enable | Boolean | 是 | true 表示啟用日誌,false 表示停用所有日誌輸出 |
使用範例
// 啟用日誌
MTVerifyApi.setLogEnable(true)
// 停用日誌
MTVerifyApi.setLogEnable(false)
// 啟用日誌
MTVerifyApi.setLogEnable(true)
// 停用日誌
MTVerifyApi.setLogEnable(false)
此代碼塊在浮窗中顯示
checkCoverage
檢查指定手機號碼是否支援 IPification 驗證服務。
方法簽章
@JvmStatic
fun checkCoverage(
context: Context,
phoneNumber: String,
callback: CoverageCallback? = null
)
@JvmStatic
fun checkCoverage(
context: Context,
phoneNumber: String,
callback: CoverageCallback? = null
)
此代碼塊在浮窗中顯示
參數說明
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
| context | Context | 是 | Android 內容物件 |
| phoneNumber | String | 是 | 國碼+使用者手機號碼 |
| callback | CoverageCallback? | 否 | 覆蓋範圍檢查回呼介面 |
回傳值
無
回呼結果
透過 CoverageCallback.onComplete(result: CoverageResult) 回傳檢查結果:
data class CoverageResult(
val code: Int, // 狀態碼,0 代表成功,其他數字代表失敗
val isAvailable: Boolean, // 是否可用(支援的電信業者)
val operatorCode: String?, // 電信業者代碼
val message: String? // 訊息(成功或錯誤訊息)
)
data class CoverageResult(
val code: Int, // 狀態碼,0 代表成功,其他數字代表失敗
val isAvailable: Boolean, // 是否可用(支援的電信業者)
val operatorCode: String?, // 電信業者代碼
val message: String? // 訊息(成功或錯誤訊息)
)
此代碼塊在浮窗中顯示
使用範例
MTVerifyApi.checkCoverage(
context = this,
phoneNumber = "6281234567890",
callback = object : CoverageCallback {
override fun onComplete(result: CoverageResult) {
if (result.code == 0) {
if (result.isAvailable) {
// 支援該服務
Log.d("MTVerify", "電信業者支援: ${result.operatorCode}")
} else {
// 不支援該服務
Log.d("MTVerify", "電信業者不支援")
}
} else {
// 檢查失敗
Log.e("MTVerify", "檢查失敗: ${result.message}")
}
}
}
)
MTVerifyApi.checkCoverage(
context = this,
phoneNumber = "6281234567890",
callback = object : CoverageCallback {
override fun onComplete(result: CoverageResult) {
if (result.code == 0) {
if (result.isAvailable) {
// 支援該服務
Log.d("MTVerify", "電信業者支援: ${result.operatorCode}")
} else {
// 不支援該服務
Log.d("MTVerify", "電信業者不支援")
}
} else {
// 檢查失敗
Log.e("MTVerify", "檢查失敗: ${result.message}")
}
}
}
)
此代碼塊在浮窗中顯示
startAuthentication
啟動手機號碼認證流程。
方法簽章
@JvmStatic
fun startAuthentication(
activity: Activity,
countryCode: String,
phoneNumber: String,
callback: AuthenticationCallback? = null
)
@JvmStatic
fun startAuthentication(
activity: Activity,
countryCode: String,
phoneNumber: String,
callback: AuthenticationCallback? = null
)
此代碼塊在浮窗中顯示
參數說明
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
| activity | Activity | 是 | Android Activity 物件,用於顯示認證介面 |
| countryCode | String | 是 | 國家代碼 |
| phoneNumber | String | 是 | 使用者手機號碼(不含國家代碼) |
| callback | AuthenticationCallback? | 否 | 認證回呼介面 |
回傳值
無
回呼結果
透過 AuthenticationCallback.onComplete(result: AuthenticationResult) 回傳認證結果:
data class AuthenticationResult(
val code: Int, // 狀態碼,0 代表成功,-1 代表失敗,-2 代表使用者取消
val token: String?, // 加密後的認證資料(包含 code 的 JSON 字串,經過 AES 加密)
val message: String? // 訊息(成功或錯誤訊息)
)
data class AuthenticationResult(
val code: Int, // 狀態碼,0 代表成功,-1 代表失敗,-2 代表使用者取消
val token: String?, // 加密後的認證資料(包含 code 的 JSON 字串,經過 AES 加密)
val message: String? // 訊息(成功或錯誤訊息)
)
此代碼塊在浮窗中顯示
注意:token 是加密後的 JSON 字串,格式如下:
{
"version": "1",
"content": {
"code": "認證碼",
"state": "狀態參數",
"appkey": "應用程式金鑰"
}
}
{
"version": "1",
"content": {
"code": "認證碼",
"state": "狀態參數",
"appkey": "應用程式金鑰"
}
}
此代碼塊在浮窗中顯示
使用範例
MTVerifyApi.startAuthentication(
activity = this,
countryCode = "62",
phoneNumber = "81234567890",
callback = object : AuthenticationCallback {
override fun onComplete(result: AuthenticationResult) {
when (result.code) {
0 -> {
// 認證成功
val token = result.token
// token 用於置換結果
Log.d("MTVerify", "認證成功: $token")
}
-1 -> {
// 認證失敗
Log.e("MTVerify", "認證失敗: ${result.message}")
}
-2 -> {
// 使用者取消
Log.d("MTVerify", "使用者取消認證")
}
}
}
}
)
MTVerifyApi.startAuthentication(
activity = this,
countryCode = "62",
phoneNumber = "81234567890",
callback = object : AuthenticationCallback {
override fun onComplete(result: AuthenticationResult) {
when (result.code) {
0 -> {
// 認證成功
val token = result.token
// token 用於置換結果
Log.d("MTVerify", "認證成功: $token")
}
-1 -> {
// 認證失敗
Log.e("MTVerify", "認證失敗: ${result.message}")
}
-2 -> {
// 使用者取消
Log.d("MTVerify", "使用者取消認證")
}
}
}
}
)
此代碼塊在浮窗中顯示
資料模型
IPEnvironment
環境類型列舉:
enum class IPEnvironment {
SANDBOX, // 測試/沙箱環境
PRODUCTION // 正式環境
}
enum class IPEnvironment {
SANDBOX, // 測試/沙箱環境
PRODUCTION // 正式環境
}
此代碼塊在浮窗中顯示
InitResult
初始化結果:
data class InitResult(
val code: Int, // 狀態碼,0 代表成功
val message: String? // 訊息
)
data class InitResult(
val code: Int, // 狀態碼,0 代表成功
val message: String? // 訊息
)
此代碼塊在浮窗中顯示
CoverageResult
覆蓋範圍檢查結果:
data class CoverageResult(
val code: Int, // 狀態碼,0 代表成功
val isAvailable: Boolean, // 是否可用
val operatorCode: String?, // 電信業者代碼
val message: String? // 訊息
)
data class CoverageResult(
val code: Int, // 狀態碼,0 代表成功
val isAvailable: Boolean, // 是否可用
val operatorCode: String?, // 電信業者代碼
val message: String? // 訊息
)
此代碼塊在浮窗中顯示
AuthenticationResult
認證結果:
data class AuthenticationResult(
val code: Int, // 狀態碼,0 代表成功,-1 代表失敗,-2 代表使用者取消
val token: String?, // 加密後的認證 token
val message: String? // 訊息
)
data class AuthenticationResult(
val code: Int, // 狀態碼,0 代表成功,-1 代表失敗,-2 代表使用者取消
val token: String?, // 加密後的認證 token
val message: String? // 訊息
)
此代碼塊在浮窗中顯示
回呼介面
InitCallback
初始化回呼介面:
interface InitCallback {
fun onComplete(result: InitResult)
}
interface InitCallback {
fun onComplete(result: InitResult)
}
此代碼塊在浮窗中顯示
CoverageCallback
覆蓋範圍檢查回呼介面:
interface CoverageCallback {
fun onComplete(result: CoverageResult)
}
interface CoverageCallback {
fun onComplete(result: CoverageResult)
}
此代碼塊在浮窗中顯示
AuthenticationCallback
認證回呼介面:
interface AuthenticationCallback {
fun onComplete(result: AuthenticationResult)
}
interface AuthenticationCallback {
fun onComplete(result: AuthenticationResult)
}
此代碼塊在浮窗中顯示
完整範例
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. 啟用日誌(可選)
MTVerifyApi.setLogEnable(true)
// 2. 初始化 SDK
MTVerifyApi.init(
context = this,
appkey = "your_app_key",
environment = IPEnvironment.SANDBOX,
callback = object : InitCallback {
override fun onComplete(result: InitResult) {
if (result.code == 0) {
// 初始化成功,可以開始使用其他功能
checkCoverage()
}
}
}
)
}
private fun checkCoverage() {
// 3. 檢查覆蓋範圍
MTVerifyApi.checkCoverage(
context = this,
phoneNumber = "6281234567890",
callback = object : CoverageCallback {
override fun onComplete(result: CoverageResult) {
if (result.isAvailable) {
// 4. 如果支援,執行認證
startAuthentication()
}
}
}
)
}
private fun startAuthentication() {
// 5. 執行認證
MTVerifyApi.startAuthentication(
activity = this,
countryCode = "62",
phoneNumber = "81234567890",
callback = object : AuthenticationCallback {
override fun onComplete(result: AuthenticationResult) {
if (result.code == 0) {
// 認證成功,處理 token
handleToken(result.token)
}
}
}
)
}
private fun handleToken(token: String?) {
// 請求 API 處理置換後的 token
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. 啟用日誌(可選)
MTVerifyApi.setLogEnable(true)
// 2. 初始化 SDK
MTVerifyApi.init(
context = this,
appkey = "your_app_key",
environment = IPEnvironment.SANDBOX,
callback = object : InitCallback {
override fun onComplete(result: InitResult) {
if (result.code == 0) {
// 初始化成功,可以開始使用其他功能
checkCoverage()
}
}
}
)
}
private fun checkCoverage() {
// 3. 檢查覆蓋範圍
MTVerifyApi.checkCoverage(
context = this,
phoneNumber = "6281234567890",
callback = object : CoverageCallback {
override fun onComplete(result: CoverageResult) {
if (result.isAvailable) {
// 4. 如果支援,執行認證
startAuthentication()
}
}
}
)
}
private fun startAuthentication() {
// 5. 執行認證
MTVerifyApi.startAuthentication(
activity = this,
countryCode = "62",
phoneNumber = "81234567890",
callback = object : AuthenticationCallback {
override fun onComplete(result: AuthenticationResult) {
if (result.code == 0) {
// 認證成功,處理 token
handleToken(result.token)
}
}
}
)
}
private fun handleToken(token: String?) {
// 請求 API 處理置換後的 token
}
}
此代碼塊在浮窗中顯示
注意事項
- 初始化順序:必須先呼叫
init()方法初始化 SDK,才能使用其他功能。 - 執行緒安全:所有 API 方法都可以在主執行緒中呼叫,回呼也會在主執行緒中執行。
- 權限需求:確保應用程式已申請必要的網路權限。
- Token 解密:認證成功後回傳的 token 是加密的,需要使用對應的解密方法處理。
- 日誌控制:建議在正式環境中停用日誌輸出,以提高效能與安全性。
版本資訊
- SDK 版本:1.0.1










