拉活服务技术接入文档更新时间: 2024-10-09 11:32:00
一、拉活服务
- 拉活服务、拉活归因只有在4.70.0(versionCode: 40005440)及以上版本的小米应用商店客户端才支持。
- 拉活服务基于直投2.0 开发,在不支持的机型(Pad和Fold)、不支持的模式(极简模式和无障碍模式)下,均无法使用拉活服务

1、接入拉活服务
接入直投2.0时,需要申请开通直投2.0拉活服务能力【按需开通拉活能力、拉活状态回传、拉活归因能力】。开通后,生成直投dp时,需要拼接 milaunch=true参数,此参数参与直投签名的鉴权。
如dp: mimarket://details?detailStyle=1&milaunch=true&xxx
2、接入拉活状态回传能力
通过接入拉活状态回传,小米应用商店会将拉活结果信息回传给调用的媒体APP。拉活状态回传能力通过后台配置更改来支持,与调用方的本身的权限相关,不需要使用deeplink来控制。
2.1 需要注册的广播
action:com.xiaomi.market.DIRECT_MAIL_STATUS
2.2 回传的参数信息
参数 | 值 | 描述 | 类型 |
packageName | 目标应用包名 | String | |
statusCode | 6001 | [未安装应用] 鉴权通过时,发送此code,表示打开了商店详情页 | int |
6002 | [已安装应用] 鉴权通过时,打开了应用首页或者三方详情页 | ||
6003 | [已安装应用] 鉴权未通过,打开了商店详情页 |
2.3 示例代码
object DirectMailStatusReceiver: BroadcastReceiver() {
val DM_STATUS = "com.xiaomi.market.DIRECT_MAIL_STATUS"
fun register(){
appContext.registerReceiver(this, IntentFilter(DM_STATUS))
}
override fun onReceive(context: Context?, intent: Intent?) {
when(intent?.action){
DM_STATUS ->{
val data = intent.extras
var statusCode = data?.getInt("statusCode")
var packageName = data?.getString("packageName")
}
}
}
}
3、接入拉活归因查询能力
说明
- 应用只能查询其自身的归因信息
- 用户手动清空小米应用商店缓存,会造成归因数据的缺失。
- 用户卸载应用后,小米应用商店缓存的归因信息会丢失。
- 对于同一包名,新保存的归因信息,会覆盖旧的归因信息。
3.1.归因参数查询
小米应用商店客户端提供查询接口,供三方调用,使用provider查询标准接口
var cursor = contentResolver.query(uri, null, null, null, null)
注意
使用该接口将涉及contentResolver的获取,ContentResolver对象会与小米应用商店进行通信,部分场景下将被识别为关联启动,请您注意如下。
- 需要在隐私声明中加上关联启动相关条例。
- 获取用户隐私同意后,再进行接口的调用。
3.2.请求参数
参数 | 类型 | 值 |
uriString | String | content://com.xiaomi.market.provider.DirectMailProvider/referrer/v3 |
projection | String[] | null |
selection | String | null |
selectionArgs | String[] | null |
sortOrder | String | null |
3.3.查询结果
- 返回cursor中,如果有拉活归因信息,则查询 "launch_referrer"时,有值。对应信息为拉活信息的jsonString.
- 返回cursor中,如果没有"launch_referrer",或者"launch_referrer"对应的value为空,则表明无拉活归因信息。
Cursor key | 格式 | 字段定义 | 说明 | Json 中参数key | 类型 | 默认态 | 说明 |
package_name | String | 广告主应用包名 | |||||
launch_referrer | Json String | 拉活归因信息 | Json 中封装了按需返回的拉活归因信息。json中的参数key 为: referrer、click_time、version、conversion_type、app_client_id、sign、is_first_open | referrer | String | 返回 | 拉活归因参数。格式为url参数格式,并且经过url encode处理,包含了callback/campaignId等归因信息。示例如下callback%3Dxxx%26adId%3D100161912%26campaignId%3D100057277%26groupId%3D100053825 |
click_time | Long | 返回 | 调起目标应用的客户端本地时间(单位:毫秒) | ||||
conversion_type | String | 返回 | 转化类型. download:下载; active:拉活 | ||||
is_first_open | Int | 返回 | 是否当日首次调起。 0-否;1-是。 | ||||
app_client_id | String | - | 广告平台标识id | ||||
sign | String | - | 调起签名 | ||||
version | Int | 返回 | 商店拉活归因版本 |
3.4.示例
private val TAG = "ReferrerTest"
private val PROVIDER_URI = "content://com.xiaomi.market.provider.DirectMailProvider/referrer/v3"
const val PACKAGE_NAME = "package_name"
const val INSTALL_REFERRER = "install_referrer"
const val LAUNCH_REFERRER = "launch_referrer"
private fun getReferrerInfoTest(path: String): String? {
var testReferrerStr = ""
var packageName: String? = null
var installReferrer: String? = null
var launchReferrer: String? = null
var cursor: Cursor? = null
val uri: Uri = Uri.parse(PROVIDER_URI + path)
val contentResolver: ContentResolver = contentResolver
try {
cursor = contentResolver.query(uri, null, null, null, null)
if (cursor != null) {
cursor.moveToFirst()
packageName = getStringOrNull(cursor, PACKAGE_NAME)
installReferrer = getStringOrNull(cursor, INSTALL_REFERRER)
launchReferrer = getStringOrNull(cursor, LAUNCH_REFERRER)
val iterator = cursor.columnNames.iterator()
while (iterator.hasNext()) {
val columnName = iterator.next()
val value = when (columnName) {
PACKAGE_NAME -> packageName
INSTALL_REFERRER -> installReferrer
LAUNCH_REFERRER -> launchReferrer
else -> null
}
Log.i(TAG, "当前返回key 为: $columnName --> vaule 为: $value")
testReferrerStr += " $columnName -> $value , \n"
}
} else {
testReferrerStr = null
Log.i(TAG, "cursor = null")
}
} catch (e: Exception) {
//处理异常
Log.e(TAG, "${e.message}")
} finally {
cursor?.close()
}
return testReferrerStr
}
private fun getStringOrNull(cursor: Cursor, column: String): String? {
return if (cursor.columnNames.contains(column)) {
cursor.getStringOrNull(cursor.getColumnIndexOrThrow(column))
} else {
null
}
}
二、注意事项
- 使用拉活服务需优先接入直投2.0,直投2.0技术接入文档
- 接入完成后,小米应用商店为您分配的业务编码(appClientId)和密钥请注意妥善保存
- 本文使用的deeplink必须由广告服务端生成然后下发到广告sdk,一定不要在客户端生成
- 一个deeplink只能单台设备使用
- 生成deeplink时建议实时生成,目前默认24小时后deeplink会过期,如果nonce中的时间戳过期会鉴权失败
文档内容是否有帮助?
有帮助
无帮助