Android SDK 归因接口使用说明
归因 API 使用说明
概述
归因模块提供的核心能力:
能力 | API | 场景 |
延迟深链还原 |
| 新安装用户首次启动 App,还原安装前点击的广告链接参数 |
拉活传参归因上报 |
| 已安装用户通过 DeepLink 被拉活时,解析链接参数并上报归因 |
剪切板归因 | handlePasteboardURL(Context, String) | 读取 OneLink 写入剪切板的内容,解析深链参数并触发归因上报 |
获取归因结果 | setOnAttributionListener(OnAttributionListener) | SDK 初始化后自动查询服务端归因结果,并通过监听器返回最终结果 |
包路径: com.umeng.commonsdk.deeplink
快速接入
1. 初始化(在 Application.onCreate 中)
import com.umeng.commonsdk.deeplink.UMCommonDeepLink;
import com.umeng.commonsdk.deeplink.UMCommonDeepLinkCallback;
// 注册 handleOpenURL 回调(可选,仅拉活场景需要)
UMCommonDeepLink.getInstance().setCallback(new UMCommonDeepLinkCallback() {
@Override
public void onResolveDeepLink(Map<String, Object> params) {
// params 包含:
// "install_params" → Map<String, String> (URL query 参数)
// "install_path" → String (URL path)
Log.d("DeepLink", "拉活参数: " + params);
}
}, null); // handler 传 null 表示回调到主线程
2. 拉活传参(在 Activity.onCreate / onNewIntent 中)
import com.umeng.commonsdk.deeplink.UMCommonDeepLink;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 从 Intent 中获取拉活 URI
Uri uri = getIntent().getData();
if (uri != null) {
boolean handled = UMCommonDeepLink.getInstance().handleOpenURL(this, uri);
// handled=true 表示 URL 中包含归因参数,已触发回调和上报
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri uri = intent.getData();
if (uri != null) {
UMCommonDeepLink.getInstance().handleOpenURL(this, uri);
}
}
3. DDL 延迟深链还原
import com.umeng.commonsdk.deeplink.UMCommonDeepLink;
import com.umeng.commonsdk.deeplink.InstallParamsCallback;
UMCommonDeepLink.getInstance().getInstallParams(this, null, new InstallParamsCallback() {
@Override
public void onSuccess(Map<String, Object> params) {
// params 包含:
// "install_params" → Map<String, String> (服务端返回的安装归因参数)
// "install_path" → String (广告目标页路径)
String targetPath = (String) params.get("install_path");
Log.d("DeepLink", "DDL 还原成功, targetPath=" + targetPath);
}
@Override
public void onFailure(int errorCode, String errorMsg) {
// errorCode: -1~-5,详见"错误码"章节
Log.w("DeepLink", "DDL 失败: code=" + errorCode + ", msg=" + errorMsg);
}
});
4. 剪切板归因
请在 UMConfigure.init() 完成后读取剪切板内容,并将读取结果传给 handlePasteboardURL()。SDK 不会主动读取系统剪切板。如需获取解析后的深链参数,请沿用前文方式提前调用 setCallback()。
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import com.umeng.commonsdk.deeplink.UMCommonDeepLink;
ClipboardManager clipboard =
(ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard != null && clipboard.hasPrimaryClip()) {
ClipData clipData = clipboard.getPrimaryClip();
if (clipData != null && clipData.getItemCount() > 0) {
CharSequence text = clipData.getItemAt(0).getText();
if (text != null) {
boolean handled = UMCommonDeepLink.getInstance()
.handlePasteboardURL(this, text.toString().trim());
if (handled) {
// 内容已进入归因处理流程
}
}
}
}剪切板归因与 handleOpenURL() 共用通过 setCallback() 注册的 UMCommonDeepLinkCallback。已注册回调时,识别成功后 SDK 会通过指定的 Handler 投递 onResolveDeepLink();Handler 传 null 时在主线程回调:
import com.umeng.commonsdk.deeplink.UMCommonDeepLinkCallback;
import java.util.Map;
UMCommonDeepLink.getInstance().setCallback(new UMCommonDeepLinkCallback() {
@Override
public void onResolveDeepLink(Map<String, Object> params) {
Map<String, String> queryParams =
(Map<String, String>) params.get("install_params");
String path = (String) params.get("install_path");
navigateToPage(path, queryParams);
}
}, null);5. 获取归因结果
请在主进程的 Application.onCreate() 中、调用 UMConfigure.init() 之前注册归因结果监听器。SDK 初始化完成后会自动查询服务端归因结果。
import com.umeng.commonsdk.UMConfigure;
import com.umeng.commonsdk.deeplink.OnAttributionListener;
import android.util.Log;
import org.json.JSONObject;
UMConfigure.setOnAttributionListener(new OnAttributionListener() {
@Override
public void onAttributionSuccess(JSONObject attribution) {
// 归因查询成功,attribution 为服务端返回的归因结果
Log.d("Attribution", "归因结果: " + attribution);
}
@Override
public void onAttributionFail(int errorCode) {
// 当前 errorCode 为 -1,表示未获得有效归因结果
Log.w("Attribution", "归因查询失败: " + errorCode);
}
});
UMConfigure.init(this, "YOUR_APPKEY", "channel",
UMConfigure.DEVICE_TYPE_PHONE, null);API 详细说明
UMCommonDeepLink
门面单例类,通过 UMCommonDeepLink.getInstance() 获取实例。
getInstance()
public static UMCommonDeepLink getInstance()
setCallback(callback, handler)
public void setCallback(UMCommonDeepLinkCallback callback, Handler handler)
注册 handleOpenURL 的全局回调。
参数 | 类型 | 说明 |
callback |
| 回调接口实例 |
handler |
| 指定回调线程;传 |
注意: 建议在 UMConfigure.preInit() 之后尽早调用,确保拉活时回调已注册。
getInstallParams(ctx, handler, callback)
public void getInstallParams(Context ctx, Handler handler, InstallParamsCallback callback)
向服务端请求 DDL(Deferred Deep Link)安装归因参数。
参数 | 类型 | 说明 |
ctx |
| 上下文(内部自动取 applicationContext) |
handler |
| 指定回调线程;传 |
callback |
| 结果回调 |
handleOpenURL(ctx, uri) / handleOpenURL(ctx, url)
public boolean handleOpenURL(Context ctx, Uri uri)
public boolean handleOpenURL(Context ctx, String url)
解析拉活 URL,检测 _umlnk_refid 参数触发归因回调和上报。
参数 | 类型 | 说明 |
ctx |
| 上下文 |
uri / url |
| 拉活传入的 URL |
返回值: true 表示有效URL且已处理;false 表示无归因参数,不做处理。
handlePasteboardURL(ctx, urlString)
public boolean handlePasteboardURL(Context ctx, String urlString)处理从系统剪切板读取到的 OneLink内容。调用前须完成 UMConfigure.init();如需接收参数回调,应提前通过 setCallback() 注册回调。SDK 只处理有效内容,普通文本或明文 URL 不会被处理。
参数 | 类型 | 说明 |
ctx | Context | Android 上下文,接口内部使用 applicationContext |
urlString | String | 从系统剪切板读取到的 OneLink 加密字符串 |
返回 true 表示内容有效,SDK 已进入归因处理流程;已注册回调时会投递解析结果。返回 false 表示内容无效。返回 true 仅代表 SDK 已受理,不代表服务端最终归因成功。
注意事项补充
SDK 不会主动读取剪切板,读取时机与隐私合规由应用自行控制。建议在用户同意隐私授权后、应用处于前台且存在明确业务场景时读取;Android 10 及以上系统对后台应用读取剪切板有限制。接口不对重复调用去重,同一剪切板内容应避免重复提交。
setOnAttributionListener(listener)
public static void setOnAttributionListener(OnAttributionListener listener)注册安装归因结果监听器。建议在 SDK 初始化前调用,确保首次初始化时自动发起归因查询。
参数 | 类型 | 说明 |
listener | OnAttributionListener | 归因结果监听器;传 null 可取消注册,重复注册时后注册的监听器覆盖先前注册 |
OnAttributionListener
public interface OnAttributionListener {
void onAttributionSuccess(JSONObject attribution);
void onAttributionFail(int errorCode);
}回调 | 说明 |
onAttributionSuccess(JSONObject attribution) | 归因查询成功;返回服务端归因结果 JSON |
onAttributionFail(int errorCode) | 未获得有效归因结果 |
成功结果可能包含 appkey、umid、channel、attributionId、attributionType、strategy、attributionTime 等字段,实际字段及取值以服务端返回为准。所有回调均异步投递到主线程。
UMCommonDeepLinkCallback
public interface UMCommonDeepLinkCallback {
void onResolveDeepLink(Map<String, Object> params);
}
handleOpenURL 命中归因参数时的回调接口。handleOpenURL未命中归因返回false则不会回调。
params 字段说明:
Key | 类型 | 说明 |
|
| URL 中所有 query 参数的键值对 |
|
| URL 的 path 部分(如 |
InstallParamsCallback
public interface InstallParamsCallback {
void onSuccess(Map<String, Object> params);
void onFailure(int errorCode, String errorMsg);
}
getInstallParams 的结果回调接口。
onSuccess params 字段说明:
Key | 类型 | 说明 |
|
| 服务端返回的安装归因参数 |
|
| 广告目标页路径 |
错误码
常量名 | 值 | 说明 |
ERROR_SERVER_MATCHING_FAILED | -1 | 服务端匹配失败 |
ERROR_ZERO_NOT_READY | -2 | SDK 初始化未就绪 |
ERROR_INTERNAL | -3 | 内部错误 |
ERROR_NETWORK | -4 | 网络错误 |
ERROR_TIMEOUT | -5 | SDK 初始化等待超时 |
完整接入示例
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 1. 友盟SDK预初始化, appkey参数和渠道channel参数请替换为您自己的设定值
UMConfigure.preInit(this, "YOUR_APPKEY", "channel");
// 2. 注册 DeepLink 回调
UMCommonDeepLink.getInstance().setCallback(new UMCommonDeepLinkCallback() {
@Override
public void onResolveDeepLink(Map<String, Object> params) {
Map<String, String> queryParams = (Map<String, String>) params.get("install_params");
String path = (String) params.get("install_path");
// 根据 path 跳转对应页面
navigateToPage(path, queryParams);
}
}, null);
// 3. 友盟SDK正式初始化,正式初始化函数支持在子线程中延迟调用
// 注意:安装后应用首次启动,正式初始化函数必须在用户同意隐私授权之后,才可以调用,否则
// 可能导致违规采集,影响应用上架
UMConfigure.init(this, "YOUR_APPKEY", "channel", UMConfigure.DEVICE_TYPE_PHONE, null);
// 4. 获取安装归因参数(建议在首页 Activity 中调用)
UMCommonDeepLink.getInstance().getInstallParams(this, null, new InstallParamsCallback() {
@Override
public void onSuccess(Map<String, Object> params) {
String targetPath = (String) params.get("install_path");
if (targetPath != null) {
// 跳转到广告目标页
navigateToPage(targetPath, (Map<String, String>) params.get("install_params"));
}
}
@Override
public void onFailure(int errorCode, String errorMsg) {
// 非首次安装或无匹配记录,忽略即可
}
});
}
}
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 4. 处理拉活 DeepLink
Uri uri = getIntent().getData();
if (uri != null) {
UMCommonDeepLink.getInstance().handleOpenURL(this, uri);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Uri uri = intent.getData();
if (uri != null) {
UMCommonDeepLink.getInstance().handleOpenURL(this, uri);
}
}
}
注意事项
调用时机:
getInstallParams仅需在 App 首次安装启动时调用一次,成功后结果会缓存到本地,后续重复调用直接返回缓存数据。handleOpenURL 时机: 建议在接收 DeepLink 的 Activity 的
onCreate和onNewIntent中都调用,确保冷启动和热启动场景均能处理。回调注册:
setCallback应在handleOpenURL之前调用,否则拉活回调会丢失。错误处理:
onFailure中ERROR_SERVER_MATCHING_FAILED(-1)是正常场景(无匹配记录),无需特殊处理。