SDK接入
穿山甲平台上创建测试状态的应用ID和广告位ID (ps:测试集成完毕后再把应用及对应的代码位改成正式状态)(ps:应用ID和代码位ID是对应关系 一个应用可以对应多个代码位ID)应用ID 对应demo中的APPID广告位ID 对应demo中的CodeId
1.导入 aar 及 SDK 依赖的 jar 包
将本 SDK 压缩包内的 open_ad_sdk.aar 复制到 Application Module/libs 文件夹(没有的话须手动创建), 并将以下代码添加到您 app 的
android{
repositories {
flatDir {
dirs 'libs'
}
}
depedencies {
//穿山甲SDK
implementation(name:'open_ad_sdk',ext:'aar')
}
2.添加权限
穿山甲SDK建议您添加下述权限,并建议在您的隐私协议中向开发者声明穿山甲SDK会获取下述权限并应用于广告投放。
<!--必要权限-->
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<!--可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告-->
<!--请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
注意:穿山甲SDK不强制获取以上权限,即使没有获取可选权限SDK也能正常运行;获取以上权限将帮助穿山甲优化投放广告精准度和用户的交互体验,提高eCPM。
适配 Android7.0 及以上
如果您的应用需要在 Android7.0 及以上环境运行,请在 AndroidManifest 中添加如下代码:
(加入到清单application中就可以)
<provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
3.在 res/xml 目录下,新建一个 xml 文件 file_paths,在该文件中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--为了适配所有路径可以设置 path = "." -->
<external-path name="tt_external_root" path="." />
<external-path name="tt_external_download" path="Download" />
<external-files-path name="tt_external_files_download" path="Download" />
<files-path name="tt_internal_file_download" path="Download" />
<cache-path name="tt_internal_cache_download" path="Download" />
</paths>
4.provider 配置(在清单中加入到第2步下边就可以 )
注意:单进程或多进程都必须配置
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
SDK中使用的so文件支持五种架构:x86,x86_64,armeabi,armeabi-v7a,arm64-v8a 如果您应用中支持的架构超出这 五种,请在build.gradle中使用abiFilters选择支持的架构。
android {
defaultConfig {
ndk{
// 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置
abiFilters'armeabi-v7a','arm64-v8a','x86','x86_64','armeabi'
}
}
}
5.初始化SDK(这是一个类)
/**
* 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
*/
public class TTAdManagerHolder {
private static boolean sInit;
public static TTAdManager get() {
if (!sInit) {
throw new RuntimeException("TTAdSdk is not init, please check.");
}
return TTAdSdk.getAdManager();
}
public static void init(Context context) {
doInit(context);
}
//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
private static void doInit(Context context) {
if (!sInit) {
TTAdSdk.init(context, buildConfig(context));
sInit = true;
}
}
// 1. 初始化SDK时需要包含APPID,播放器,appname,通知栏提示,debug状态,网络状态等信息
// 2. 如果是多进程的话,需要在每个请求广告的子进程都进行初始化设置
private static TTAdConfig buildConfig(Context context) {
return new TTAdConfig.Builder()
.appId("5001121")
.useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
.appName("应用id")
.titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
.allowShowNotify(true) //是否允许sdk展示通知栏提示
.allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
.supportMultiProcess(false)//是否支持多进程
//.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。
.build();
}
}
在Application中调用
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 穿山甲SDK初始化
// 强烈建议在应用对应的Application#onCreate()方法中调用,避免出现content为null的异常
TTAdManagerHolder.init(this);
//如果明确某个进程不会使用到广告SDK,可以只针对特定进程初始化广告SDK的content
//if (PROCESS_NAME_XXXX.equals(processName)) {
// TTAdManagerHolder.init(this)
//}
}
}
6.展示广告(激励视频TTRewardVideoAd)
TTAdManager ttAdManager = TTAdManagerHolder.get();
TTAdNative mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
AdSlot adSlot =new AdSlot.Builder()
.setCodeId("广告位id")
.setSupportDeepLink(true)
.setAdCount(2)
//个性化模板广告需要设置期望个性化模板广告的大小,单位dp,激励视频场景,只要设置的值大于0即可。仅模板广告需要设置此参数
.setExpressViewAcceptedSize(500, 500)
.setImageAcceptedSize(1080, 1920)
.setRewardName("金币")//奖励的名称
.setRewardAmount(3)//奖励的数量
//必传参数,表来标识应用侧唯一用户;若非服务器回调模式或不需sdk透传
//可设置为空字符串
.setUserID("user123")
.setMediaExtra("media_extra")//用户透传的信息,可不传
.build();
7.视频回调
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
@Override
public void onError(int i, String s) {
//开屏广告请求失败
}
@Override
public void onRewardVideoAdLoad(TTRewardVideoAd ttRewardVideoAd) {
ttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {
@Override
public void onAdShow() {
showToast("播放完视屏即可签到领奖");
}
@Override
public void onAdVideoBarClick() {
showToast("开始下载");
}
@Override
public void onAdClose() {
showToast("关闭广告");
}
@Override
public void onVideoComplete() {
showToast("视频完成");
}
@Override
public void onVideoError() {
// showToast("视频错误");
}
@Override
public void onRewardVerify(boolean b, int i, String s) {
// showToast("视频异常");
}
@Override
public void onSkippedVideo() {
showToast("跳过视频");
}
});
ttRewardVideoAd.showRewardVideoAd(FoundSignActivity.this);
}
@Override
public void onRewardVideoCached() {
}
});
网友评论