一、基础版SDK方式
1.1 集成SDK
1.1.1 添加AAR
添加小米安全开放服务SDK到项目Module(app)的libs路径中
SDK文件
名称:sdk-xsof-20251027-v3.0.0-basic-release.aar
地址:https://kpan.mioffice.cn/webfolder/ext/DoRhkFel%231v%24uVm31GQvyw%40%40
密码:SC8D
1.1.2 配置Gradle
在Module所属的Gradle文件(app/build.gradle)中增加编译依赖
// 只添加libs/sdk-xsof-20251027-v3.0.0-basic-release.aar一个aar
implementation files('libs/sdk-xsof-20251027-v3.0.0-basic-release.aar')或
// 添加libs文件夹下的所有aar
implementation fileTree(dir: "libs", includes: "*.aar")注意:上述步骤中的文件路径和Gradle配置仅供参考,
可根据项目实际情况灵活调整,只要保证aar参与到项目编译即可。
1.1.3 配置appId、appKey
在项目中添加应用的appId、appKey等信息
应用在小米开放平台注册后,会分配对应的appId和appKey。
appId和appKey在SDK初始化时会用到,需要调用方提供。
appId和appKey可以在代码中写常量,也可以在工程中增加配置文件,然后在SDK初始化时读取。
注意:正式接入时,会提供配置后台给三方开发者来开启服务&上传SHA256证书指纹。
SHA256证书指纹查询方法:
1. 通过终端keytool命令查询
keytool -list -v -keystore <keystore-file-path>
2. 通过Android Studio Gradle的signingReport task查询
1.2 API使用说明
完成步骤1后,即可使用小米安全开放框架SDK提供的API。
1.2.1 API简要说明
public class MiSafetyDetectClient {
/**
* 初始化SDK
* @param appId 应用的AppId
* @param appKey 应用的AppKey
*/
public void init(String appId, String appKey);
/**
* 获取设备可信检测信息
* @param challenge 随机数
* @param onCompleteListener 接收检测结果的回调
*/
public void getTrustDeviceStatus(String challenge,
OnCompleteListener<TrustDeviceStatusResponse> onCompleteListener);
/**
* 获取恶意应用检测信息
* @param onCompleteListener 接收检测结果的回调
*/
public void getRiskApps(
OnCompleteListener<RiskAppResponse> onCompleteListener);
/**
* 获取模拟点击检测信息
* @param timeInterval 需要检测的时间范围
* @param onCompleteListener 接收检测结果的回调
*/
public void getSimulatedTouchDetectResult(long timeInterval,
OnCompleteListener<SimulatedTouchResponse> onCompleteListener);
/**
* 获取欺诈风险评分
* @param challenge 随机数
* @param callback 接收检测结果的回调
*/
public void getFraudRiskScore(String challenge, OnCompleteListener<FraudScoreResponse> onCompleteListener);
}
1.2.2 使用示例
1. SDK初始化
import com.xiaomi.security.xsof.MiSafetyDetect;
import com.xiaomi.security.xsof.safetydetect.MiSafetyDetectClient;
ClassName {
private static final String APP_ID = "***"; // replace with your appId
private static final String APP_KEY = "***"; // replace with your appKey
// 通过MiSafetyDetect#getMiSafetyDetectClient获取MiSafetyDetectClient实例
MiSafetyDetectClient miSafetyDetectClient =
MiSafetyDetect.getMiSafetyDetectClient(getContext());
// 如果是null,说明当前系统版本不支持安全开发框架相关服务
if (miSafetyDetectClient != null) {
miSafetyDetectClient.init(APP_ID, APP_KEY);
}
}初始化后即可使用小米安全开放框架提供的各项服务。
目前小米安全开放框架已支持三项检测:
- 设备可信检测
- 恶意应用检测
- 模拟点击检测
详细信息请参考开发者文档
2. 判断当前设备是否支持涉诈行为检测
/**
* 判断是否支持欺诈检测
* @return boolean
*/
private fun isSupportFraudDetection(): Boolean {
return miSafetyDetectClient != null && getSafetyDetectServerVersion(this) >= 3
}
/**
* 获取安全开放服务版本。安全开放服务在3及以上版本才支持欺诈检测
* @param context Context
* @return int
*/
private fun getSafetyDetectServerVersion(context: Context): Int {
try {
val packageManager = context.packageManager
val packageInfo = packageManager
.getPackageInfo(
"com.miui.securitycenter",
PackageManager.GET_META_DATA
)
val metaData = packageInfo.applicationInfo?.metaData
if (metaData?.containsKey("com.xiaomi.security.xsof.service.version") == true) {
return metaData.getInt("com.xiaomi.security.xsof.service.version")
}
} catch (e: Exception) {
// empty
}
return 0
}3. 获取诈骗风险评分
/**
* 获取诈骗风险评分
*/
private fun getFraudScoreDetectionResult() {
if (!isSupportFraudDetection()) {
return
}
val challenge: String = SdkUtils.Companion.getChallengeFromServer(packageName)
miSafetyDetectClient?.getFraudRiskScore(challenge, OnCompleteListener { response: MiSafetyDetectApi.FraudScoreResponse? ->
if (response?.isSuccess == true) {
Log.i(TAG, "fraud score detection result : " + response.detectionResult)
val resp = response.detectionResult
try {
val jsonObject = JSONObject(resp)
val data: String? = jsonObject.get("data").toString()
val authenticity = jsonObject.get("authenticity") as JSONObject
val checkResult = "check hash: " + HashUtils.checkHashSHA256(data, authenticity)
Log.i(TAG, checkResult)
} catch (e: JSONException) {
Log.e(TAG, "onComplete: ", e)
}
} else {
val statusCode = response?.statusCode
Log.e(TAG, "Get fraud score detection result error, code = $statusCode")
}
})
二、进阶版SDK方式
服务是免费的,但此服务只提供给愿意与小米深度合作的伙伴。
请使用企业邮箱联系developer@xiaomi.com,与我们建立联系后,获取进阶版SDK与AIDL接入方式。
集成方式同基础版SDK,区别是额外提供了3个涉诈元数据检测api。
- 获取当前欺诈风险结果
- 获取前序欺诈风险结果
- 获取涉诈行为持续时长
三、开放服务错误码
| 错误代码 | 值 | 说明 | 处理说明 | 支持版本 |
| SDK_INTERNAL_ERROR | 1000 | SDK内部错误,建议重试。 | 1 | |
| SERVICE_INTERNAL_ERROR | 1001 | 安全服务内部错误,建议重试。 | 1 | |
| ERROR_MAIN_THREAD_CALL | 1002 | 在主线程调用方法 | 不要在主线程调用方法 | 1 |
| ERROR_CALL_REPEATEDLY | 1003 | 同一应用在调用某一接口未返回时,再次调用该接口 | 1 | |
| ERROR_REQUEST_TIMEOUT | 1004 | 调用请求超时,建议稍后重试。 | 1 | |
| NETWORK_ERROR | 1005 | 未找到可用网络。 | 提醒用户检查网络连接。 | 1 |
| SDK_INVALID_ARGUMENT | 1006 | 参数格式错误。 | 检查是否调用了初始化方法; 检查是否传了challenge; 调用方包名和注册的包名是否一致 | 1 |
| ERROR_TOO_MANY_REQUESTS | 1007 | 发起调用的应用向该 API 发出的请求太多,被限制调用。 1s同一API调用次数不能超过1次 | 按照失败后的重试策略尝试重新调用。 | 1 |
| CLIENT_APP_NOT_INSTALLED | 1008 | 发起调用的应用未安装。 | 1 | |
| CLIENT_APP_UID_MISMATCH | 1009 | 发起调用的应用的 UID 异常。 | 1 | |
| CLIENT_APP_AUTHORITY_SUCCESS | 1010 | 发起调用的应用鉴权成功。 | 1 | |
| CLIENT_APP_AUTHORITY_FAILED | 1011 | 1. 手管未联网(需要打开手机管家,点击同意隐私协议) 2. 发起调用的应用鉴权失败,请检查传入的AppId和AppKey与开发者后台配置的是否一致。 3. 需要确保使用的签名和申请时的签名一致 4. 检查手机时间是否正确,不要自己设置时间 | 3.0版本之前,为1011; 3.0版本后,拆分成了具体的错误码; | 1 |
| AUTHORITY_STATE_VERIFYING | 1012 | 发起调用的应用正在进行鉴权。 | 1 | |
| ERROR_TRUST_SERVICE_NOT_AVAILABLE | 1013 | 可信服务不可用 | 设备可信服务在hyperOS1.0及以上才支持 | 1 |
| ERROR_BIND_TRUST_SERVICE_FAILED | 1014 | 可信服务bind失败。 | 1 | |
| CHALLENGE_FORMAT_ILLEGAL | 1015 | challenge 格式错误,请检查challenge的长度和内容是否符合要求。 | 1 | |
| ERROR_STATE_BUSY | 1016 | 不同应用短时间内多次调用SDK,为限制调用频率,返回BUSY | 1min所有应用调用开放框架api次数需总共不超过10次 | 1 |
| ERROR_PERMISSION_DENIED | 1017 | 没有权限,通过aidl接入报此问题 | 1 | |
| CLIENT_APP_AUTHORITY_FAILED_BY_NET_ERROR | 1021 | 鉴权失败:手管无法联网鉴权 | 需要同意手机管家联网权限 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_APP_KEY_ERROR | 1022 | 鉴权失败:appId/appkey 不匹配 | 检查下配置的appId/appkey是否正确 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_SIGNATURE_ERROR | 1023 | 鉴权失败:signature错误 | 检查下apk签名是否正确 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_DATE_ERROR | 1024 | 鉴权失败:手机时间错误 | 需要手机设置正确的时间 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_QUOTA_EXCEEDED_ERROR | 1025 | 鉴权失败:超出配额 | 申请配额 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_SERVER_ERROR | 1026 | 鉴权失败:鉴权服务错误 | 重试 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_QPS_LIMIT_ERROR | 1027 | 鉴权失败:QPS超过配置 | 申请配额 | 3 |
| CLIENT_APP_AUTHORITY_FAILED_BY_OTHER_ERROR | 1028 | 鉴权失败:其他错误 | 重试 | 3 |
| ERROR_NOT_SUPPORT_XSOF | 2001 | 当前设备不支持安全检测服务 | 1 | |
| ERROR_NOT_SUPPORT_XSOF_API | 2002 | 当前SDK版本不支持此API | 3 | |
| ERROR_SERVER_NOT_SUPPORT_API | 2003 | 当前系统服务不支持此API | 3 | |
| MI_TRUST_ERROR | >=3000 | 设备可信服务底层异常 | 1 | |
| 3001 | key未写入 | 1 | ||
| 3002 | 设备底层暂不支持 | 3.0上底层修复了此问题,修改成了2048字节大小 | 1 | |
| 3018 | challenge值不符合 | challenge 长度不够。challenge值为服务端下发的String类型的随机数. 要求: 1.长度为16至256个字符 ; 2.不要包含换行等特殊字符 | 1 |