Dirichlet 聚合SDK Android 接入文档
SDK 支持版本
- Dirichlet SDK 和 优量汇 (Tencent Ad SDK) 最低支持 Android 5.0(API level 21)
- 穿山甲 (Pangle) SDK 最低支持 Android 7.0(API level 24)
- 编译环境为 Android Studio
SDK 配置
Maven 仓库配置
在 project 级别的 build.gradle 文件中添加穿山甲 (Pangle) Maven 的引用:
allprojects {
repositories {
maven {
url 'https://artifact.bytedance.com/repository/pangle'
}
}
}
依赖配置
将 DirichletAD_Mediation_4.2.4.3.aar、DirichletAD_CSJ_Adapter_4.2.4.3.aar、DirichletAD_GDT_Adapter_4.2.4.3.aar 拷贝到游戏目录下的 src/main/libs 目录中。
在项目目录下 build.gradle 文件中添加代码:
repositories {
flatDir{
dirs 'src/main/libs'
}
}
dependencies {
implementation (name: "DirichletAD_Mediation_4.2.4.3", ext: "aar") // Dirichlet 聚合SDK(包含Dirichlet广告SDK)
implementation (name: "DirichletAD_CSJ_Adapter_4.2.4.3", ext: "aar") // 穿山甲 adapter SDK
implementation (name: "DirichletAD_GDT_Adapter_4.2.4.3", ext: "aar") // 优量汇 adapter SDK
implementation('com.pangle.cn:ads-sdk-pro:7.4.2.2') { // 穿山甲广告 SDK
exclude group: 'com.android.support'
}
implementation 'com.qq.e.union:union:4.671.1541' // 优量汇广告SDK
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation "com.android.support:appcompat-v7:28.0.0"
implementation "com.android.support:support-annotations:28.0.0"
implementation "com.android.support:support-v4:28.0.0"
implementation "com.github.bumptech.glide:glide:4.9.0"
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
权限申请 & 清单配置
配置 AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 必须的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 为了获取更精准的 推送数据,建议加上的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<!-- targetVersion 31 及以上建议加上这个权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<!-- 为了获取更好的广告体验,建议加上以下权限来获取用户信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 加上下列权限可以提高广告的转化率 -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
</manifest>
Android 代码混淆
聚合 SDK 已内置 R8/ProGuard 混淆规则(consumerProguardFiles),默认情况下无需额外添加 -keep / -dontwarn 配置。
若工程使用自定义混淆策略导致类被误删/误混淆,请根据构建或运行日志按需补充规则。
资源混淆配置
如果您的工程中接入了资源混淆插件 AndResGuard,需要在 build.gradle 中新增白名单配置:
andResGuard {
// 白名单配置,请参考demo中的 `whiteList.txt`
whiteList = [
"R.integer.min_screen_width_bucket",
"R.style.DialogAnimationUp",
"R.style.DialogAnimationRight",
"R.style.DialogFullScreen",
"R.drawable.gdt_*"
...
]
}
获取广告权限
在获取 IMEI 和地理位置信息时,需要用户授予权限。建议先询问权限,再进行初始化工作。
DirichletAdManager.get().requestPermissionIfNecessary(activity);
初始化
DirichletAdConfig config = new DirichletAdConfig.Builder()
.withMediaId(your_media_id) // 必选参数。为 Dirichlet ADN 注册的媒体 ID
.withMediaName(your_media_name) // 必选参数。为 Dirichlet ADN 注册的媒体名称
.withMediaKey(your_media_key) // 必选参数。媒体密钥,可以在 Dirichlet ADN 后台查看
.enableDebug(false) // 可选参数,是否打开 debug 调试信息输出:true 打开、false 关闭。默认 false 关闭
.withCustomController(new DirichletAdCustomController() {
// 是否允许 SDK 主动使用地理位置信息
@Override
public boolean isCanUseLocation() {
return enableGetLocation;
}
// 当 isCanUseLocation=false 时,可传入地理位置信息,DirichletAd 使 用您传入的地理位置信息
@Override
public DirichletAdLocation getDirichletAdLocation() {
return new DirichletAdLocation(longitude, latitude, accuracy);
}
// 是否允许 SDK 主动使用手机硬件参数,如 imei
@Override
public boolean isCanUsePhoneState() {
return enableGetPhoneState;
}
// 当 isCanUsePhoneState=false 时,可传入 imei 信息,DirichletAd 使用您传入的 imei 信息
@Override
public String getDevImei() {
return imei;
}
// 是否允许 SDK 主动使用 ACCESS_WIFI_STATE 权限
@Override
public boolean isCanUseWifiState() {
return enableGetWifiState;
}
// 是否允许 SDK 主动使用 WRITE_EXTERNAL_STORAGE 权限
@Override
public boolean isCanUseWriteExternal() {
return enableWriteExternal;
}
// 开发者可以传入 oaid
// 信通院 OAID 的相关采集——如何获取 OAID:
// 1. 移动安全联盟官网 http://www.msa-alliance.cn/
// 2. 信通院统一 SDK 下载 http://msa-alliance.cn/col.jsp?id=120
@Override
public String getDevOaid() {
return oaid;
}
// 是否允许 SDK 主动获取设备上应用安装列表的采集权限
@Override
public boolean alist() {
return enableGetAppList;
}
// 是否允许 SDK 主动获取 ANDROID_ID
@Override
public boolean isCanUseAndroidId() {
return enableGetAndroidId;
}
})
.build();
// context 为 application 的上下文
DirichletSdk.init(context, config, new DirichletSdk.InitListener() {
@Override
public void onInitSuccess() {
Log.d("DirichletSdk", "初始化成功");
}
@Override
public void onInitFail(int code, String msg) {
Log.d("DirichletSdk", "初始化失败: " + code + ", " + msg);
}
});
广告通用接口
创建 广告加载器
// 注意,一个 Activity 中只需要创建一个 DirichletAdNative 对象
DirichletAdNative adNative = DirichletAdManager.get().createAdNative(context);
广告请求参数
DirichletAdRequest request = new DirichletAdRequest.Builder()
.withSpaceId(spaceId) // 必填,广告位 id
.withUserId(user_id) // 选填,用户 ID(用于激励广告奖励验证)
.withExtra1(extra_info) // 选填,激励广告验证奖励时透传参数
.withRewardName(reward_name) // 选填,奖励的名称(激励广告)
.withRewardAmount(100) // 选填,奖励的数量(激励广告)
.withExpressViewAcceptedSize(width, height) // 选填,广告视图尺寸(开屏、Banner)
.withExpressImageAcceptedSize(width, height) // 选填,视频视图尺寸(信息流)
.build();
广告对象通用方法
// 所有广告对象都包含以下方法
class Dirichlet**Ad {
// 销毁广告
public void destroy();
// 广告是否有效
boolean isValid();
// 获取广告额外参数,例如广告唯一 track_id、价格等
Map<String, Object> getDirichletExtraInfo();
}
广告类型
激励视频广告
激励视频是一种全屏播放的视频广告,用户可以在观看完整的视频后获取奖励。
自动加载展示(推荐)
4.2.0.1 新增
showRewardVideoAutoAd 接口将加载和展示合并为一次调用,内部自动管理广告缓存。若有可用缓存则立即展示,否则自动加载后展示。
DirichletAdRequest request = new DirichletAdRequest.Builder()
.withSpaceId(YOUR_SPACE_ID)
.withUserId("user_123")
.withRewardName("金币")
.withRewardAmount(100)
.build();
adNative.showRewardVideoAutoAd(request, new DirichletAdNative.RewardVideoAutoAdListener() {
@Override
public void onError(int code, String message) {
Log.e("DirichletAd", "激励视频加载/展示失败: " + code + ", " + message);
}
@Override
public void onAdShow() {
Log.d("DirichletAd", "激励视频展示");
}
@Override
public void onAdClose() {
Log.d("DirichletAd", "激励视频关闭");
}
@Override
public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int code, String msg) {
if (rewardVerify) {
Log.d("DirichletAd", "获得奖励: " + rewardAmount + " " + rewardName);
}
}
@Override
public void onAdClick() {
Log.d("DirichletAd", "激励视频点击");
}
});
手动加载展示
获取广告
// 构建广告请求
DirichletAdRequest request = new DirichletAdRequest.Builder()
.withSpaceId(YOUR_SPACE_ID) // 广告位 ID
.withUserId(user_123) // 用户 ID(用于奖励验证)
.withExtra1(extra_data) // 额外参数
.withRewardName("金币") // 奖励名称
.withRewardAmount(100) // 奖励数量
.build();
// 加载激励视频广告
adNative.loadRewardVideoAd(request, new DirichletAdNative.RewardVideoAdListener() {
@Override
public void onRewardVideoAdLoad(DirichletRewardVideoAd rewardVideoAd) {
// 广告加载成功
Log.d("DirichletAd", "激励视频广告加载成功");
// 可以展示广告
showRewardVideoAd(rewardVideoAd);
}
@Override
public void onError(int code, String message) {
// 广告加载失败
Log.e("DirichletAd", "激励视频广告加载失败: " + code + ", " + message);
}
});
播放
private void showRewardVideoAd(DirichletRewardVideoAd rewardVideoAd) {
if (rewardVideoAd != null && rewardVideoAd.isValid()) {
// 设置交互回调 listener,曝光、点击、关闭、奖励等回调事件
rewardVideoAd.setRewardAdInteractionListener(new DirichletRewardVideoAd.RewardAdInteractionListener() {
@Override
public void onAdShow() {
Log.d("DirichletAd", "激励视频广告曝光展示");
}
@Override
public void onAdClick() {
Log.d("DirichletAd", "激励视频广告点击");
}
@Override
public void onAdClose() {
Log.d("DirichletAd", "激励视频广告关闭");
}
@Override
public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int code, String msg) {
if (rewardVerify) {
Log.d("DirichletAd", "获得奖励: " + rewardAmount + ", " + rewardName);
// 发放奖励给用户
} else {
Log.d("DirichletAd", "奖励验证失败: " + code + ", " + msg);
}
}
});
// 展示激励广告
rewardVideoAd.showRewardVideoAd(activity);
}
}