Android端穿山甲SDK集成
流程
创建测试状态的应用及应用下对应的测试状态的代码位ID
项目对接SDK完毕后 拿APP到应用商店审核 得到应用商店的APP的下载地址 结合文档转换成apk下载地址/APP详情页地址
然后再到平台把相关的应用及对应的代码位都转成正式状态
SDK接入
- 穿山甲平台上创建测试状态的应用ID和广告位ID
备注:测试集成完毕后再把应用及对应的代码位改成正式状态
备注:应用ID和代码位ID是对应关系 一个应用可以对应多个代码位ID
应用ID 对应demo中的APPID
广告位ID 对应demo中的CodeID
- 将本SDK压缩包内的open_ad_sdk.aar添加到build.gradle中:
repositories {
flatDir {
dirs 'libs'
}
}
depedencies {
compile(name: 'open_ad_sdk', ext: ‘aar')
}
- 添加权限
<!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 可选权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_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" />
<!--suppress DeprecatedClassUsageInspection -->
<uses-permission android:name="android.permission.GET_TASKS" />
<!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!--可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告-->
<!--请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--demo场景用到的权限,不是必须的-->
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
<!-- 建议添加“query_all_package”权限,穿山甲将通过此权限在Android R系统上判定广告对应的应用是否在用户的app上安装,避免投放错误的广告,以此提高用户的广告体验。若添加此权限,需要在您的用户隐私文档中声明! -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
- 适配Anroid7.0及以上
注:主要是涉及到广告下载
<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>
在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>
为了适配下载和安装相关功能,在工程中引用的包 com.android.support:support-v4:24.2.0
使用24.2.0以及以上版本
- 运行环境配置
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="24" />
-
NDK配置
注:可根据自己的需求进行导入
SDK中使用的so文件支持五种架构:x86,x86_64,armeabi,armeabi-v7a,arm64-v8a 如果您应用中支持的架构超出这 五种,请在build.gradle中使用abiFilters选择支持的架构。如下所示:
ndk { // 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置
abiFilters ‘armeabi-v7a’, ‘arm64-v8a’, ‘x86’, ‘x86_64’, ‘armeabi’
} -
隐私权限
public abstract class TTCustomController {
/**
* 是否允许SDK主动使用地理位置信息
*
* @return true可以获取,false禁止获取。默认为true
*/
public boolean isCanUseLocation() {
return true;
}
/**
* 当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息
*
* @return 地理位置参数
*/
public TTLocation getTTLocation() {
return null;
}
/**
* 是否允许SDK主动使用手机硬件参数,如:imei
*
* @return true可以使用,false禁止使用。默认为true
*/
public boolean isCanUsePhoneState() {
return true;
}
/**
* 当isCanUsePhoneState=false时,可传入imei信息,穿山甲sdk使用您传入的imei信息
*
* @return imei信息
*/
public String getDevImei() {
return null;
}
/**
* 是否允许SDK主动使用ACCESS_WIFI_STATE权限
*
* @return true可以使用,false禁止使用。默认为true
*/
public boolean isCanUseWifiState() {
return true;
}
/**
* 是否允许SDK主动使用WRITE_EXTERNAL_STORAGE权限
*
* @return true可以使用,false禁止使用。默认为true
*/
public boolean isCanUseWriteExternal() {
return true;
}
/**
* 开发者可以传入oaid
*
* @return oaid
*/
public String getDevOaid() {
return null;
}
/**
*是否允许SDK上报手机APP安装列表
*/
@Override
public boolean alist() {
return super.alist();
}
}
注意:
-
重写getTTLocation()之前需要设置isCanUseLocation()
-
重写getDevImei()之前需要先设置isCanUsePhoneState()
-
新增:alist方法 是否允许SDK上报手机APP安装列表
-
初始化SDK
在Application#onCreate()方法中调用以下代码来初始化穿山甲SDK。 SDK已支持多进程,如果明确某个进程不会使用到广告SDK,可以只针对特定进程初始化广告SDK
注:TTAdManagerHolder保证处于单例状态
注:SDK初始化放到主线程进行处理
private static TTAdConfig buildConfig(Context context) {
return new TTAdConfig.Builder()
.appId("5001121")
.useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
.appName("APP测试媒体")
.titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
.allowShowNotify(true) //是否允许sdk展示通知栏提示
.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
.supportMultiProcess(true)//是否支持多进程
.needClearTaskReset()
//.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。
.build();
}
- appId是账号下申请的应用ID(ps:以5开头7位)
- useTextureView有SurfaceView冲突的场景,可以使用TextureView(ps:如果出现黑屏
1.可以检查一下清单文件中最后一条权限部分
2.尝试更换TextureView进行加载视频
3.尝试开启硬件加速android:hardwareAccelerated=“true”) - appName(ps:可随意填写不为空的字符串)
- titleBarTheme(ps:主题 如果不存在冲突可使用默认主题)
- allowShowNotify(ps:涉及到下载通知栏部分)
allowShowPageWhenScreenLock(ps:锁屏广告显示部分) 该方法已废弃- directDownloadNetworkType(ps:可根据具体的产品需求填写 目前支持WiFi和4G及任何情况下都可以弹出二次弹窗 如果需要任何情况下都弹窗 ()里直接写空就可以了)
- supportMultiProcess(ps:是否支持多进程)
1.如果项目是多进程 需要设置true 多进程中如果每个进程中都需要展示广告 必须每个进程都进行SDK的初始化
2.如果项目是单进程必须更改为false - provider无论APP处于任何状态(debug或release)都需要进行设置
- SDK包内whiteList.txt 白名单上的资源不支持混淆 SDK更新迭代过程中检查一遍白名单内容
加载广告
注:加载和展示广告都需要放到主线程中
- 构建TTAdManager对象
TTAdManager对象为整个SDK的入口接口,可用于广告获取、权限请求、版本号获取
TTAdManager ttAdManager = TTAdManagerHolder.get();
- 申请部分权限 (建议每次广告对象加载之后都需要申请一次 ps:开屏视频不需要)
TTAdManagerHolder.get().requestPermissionIfNecessary(this);
- 创建TTAdNative对象(用于调用广告请求接口)
TTAdNative mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
构建AdSlot对象
注:AdSlot中的参数一旦在代码中填写 会以代码中填写的为主
AdSlot adSlot = new AdSlot.Builder()
// 必选参数 设置您的CodeId
.setCodeId(“900486272")
// 必选参数 设置广告图片的最大尺寸及期望的图片宽高比,单位Px
// 注:必填字段,期望的图片尺寸,返回尺寸可能有差异
.setImageAcceptedSize(640, 320)
//模板广告需要设置期望个性化模板广告的大小,单位dp,代码位是否属于个性化模板广告,请在穿山甲平台查看
.setExpressViewAcceptedSize(expressViewWidth, expressViewHeight)
// 可选参数 设置是否支持deeplink
.setSupportDeepLink(true)
// 可选参数,针对信息流广告设置每次请求的广告返回个数,最多支持3个
.setAdCount(1)
//请求原生广告时候需要设置,参数为TYPE_BANNER或TYPE_INTERACTION_AD
.setNativeAdType(AdSlot.TYPE_BANNER)
//激励视频奖励的名称,针对激励视频参数 3.3.0.0版本已废弃
.setRewardName("金币")
//激励视频奖励个数 3.3.0.0版本已废弃
.setRewardAmount(3)
//用户ID,使用激励视频必传参数
//非毕传参数 用来标识应用侧唯一用户;若非服务器回调模式或不需sdk透传,可设置为空字符串
.setUserID("user123")
//设置期望视频播放的方向,为TTAdConstant.HORIZONTAL或TTAdConstant.VERTICAL
.setOrientation(orientation)
//激励视频奖励透传参数,字符串,如果用json对象,必须使用序列化为String类型,可为空
.setMediaExtra("media_extra")
.build();
- setCodeId是账号下申请的应用ID(ps:以9开头9位)
- setImageAcceptedSize(单位px ps:开屏广告尺寸动态获取屏幕宽高)
- setExpressViewAcceptedSize(单位dp ps:模板类型的广告可以填写 以代码中填写的为主 激励视频和全屏视频必须填写这个部分)
- setRewardName方法 3.3.0.0版本已废弃
- setRewardAmount方法 3.3.0.0版本已废弃
注意:
平台上创建的代码位尺寸单位是px 代码中设置广告请求size的单位是dp
广告类型
注:模板和非模板代码位的区分
可根据截图部分在平台上查看创建的代码位是否是模板 使用不同的方法获取广告
注:以下部分都是SDK直接返回一个view 不支持获取view的信息 开发者直接展示view
注:模板类型的代码位在设置AdSlot广告对象的时候一定要设置该方法setExpressViewAcceptedSize
注:在广告加载展示完毕后 在Activity的onDestroy方法中把广告对象置为null
- 个性化模板信息流 方法:
loadNativeExpressAd
异步请求广告
使用方法:
mTTAdNative.loadNativeExpressAd(adSlot, new TTAdNative.NativeExpressAdListener() {
@Override
public void onError(int code, String message) {
}
@Override
public void onNativeExpressAdLoad(List<TTNativeExpressAd> ads) {
mTTAd.render();
}
});
onNativeExpressAdLoad回调直接返回的是一个集合
在请求的时候建议最多请求3条 SDK最多返回3条
render直接放到广告返回成功的回调中
- 个性化模板banner 方法:
loadBannerExpressAd
异步请求广告
mTTAdNative.loadBannerExpressAd(adSlot, new TTAdNative.NativeExpressAdListener() {
@Override
public void onError(int code, String message) {
}
@Override
public void onNativeExpressAdLoad(List<TTNativeExpressAd> ads) {
mTTAd.render();
}
});
setSlideIntervalTime设置轮播的时间
render直接放到广告返回成功的回调中
- 个性化模板插屏 方法:
loadInteractionExpressAd
异步请求广告
mTTAdNative.loadInteractionExpressAd(adSlot, new TTAdNative.NativeExpressAdListener() {
@Override
public void onError(int code, String message) {
}
@Override
public void onNativeExpressAdLoad(List<TTNativeExpressAd> ads) {
mTTAd.render();
}
});
render直接放到广告返回成功的回调中
- 全屏广告 ·方法:
loadFullScreenVideoAd
异步请求广告
//模板广告需要设置期望个性化模板广告的大小,单位dp,全屏视频场景,只要设置的值大于0即可
必须设置:setExpressViewAcceptedSize(500,500)
mTTAdNative.loadFullScreenVideoAd(adSlot, new TTAdNative.FullScreenVideoAdListener() {
@Override
public void onError(int code, String message) {
}
@Override
public void onFullScreenVideoAdLoad(TTFullScreenVideoAd ad) {
}
@Override
public void onFullScreenVideoCached() {
}
});
//展示广告,并传入广告展示的场景
mttFullVideoAd.showFullScreenVideoAd(FullScreenVideoActivity.this, TTAdConstant.RitScenes.GAME_GIFT_BONUS, null);
注:展示广告放到主进程中
- 开屏广告 **方法:
loadSplashAd
异步请求广告
非模板开屏要设置 单位px
setImageAcceptedSize(1080, 1920)
模板开屏需设置 (非模板开屏一定不要设置该方法) 单位dp
setExpressViewAcceptedSize(expressViewWidth, expressViewHeight)
mTTAdNative.loadSplashAd(adSlot, new TTAdNative.SplashAdListener() {
@Override
@MainThread
public void onError(int code, String message) {
}
@Override
@MainThread
public void onTimeout() {
}
@Override
@MainThread
public void onSplashAdLoad(TTSplashAd ad) {\
}
}, AD_TIME_OUT);
- 激励视频 方法:
loadRewardVideoAd
异步请求广告
//模板广告需要设置期望个性化模板广告的大小,单位dp,全屏视频场景,只要设置的值大于0即可
必须设置:setExpressViewAcceptedSize(500,500)
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
@Override
public void onError(int code, String message) {
}
//视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。
@Override
public void onRewardVideoCached() {
}
@Override
public void onRewardVideoAdLoad(TTRewardVideoAd ad) {
}
});
为保证视频的流程度建议show广告放在onRewardVideoCached回调里
mttRewardVideoAd.showRewardVideoAd(RewardVideoActivity.this, TTAdConstant.RitScenes.CUSTOMIZE_SCENES, “scenes_test”);
注:展示广告放到主进程中
- 个性化模板Draw信息流 方法:
loadExpressDrawFeedAd
异步请求广告
mTTAdNative.loadExpressDrawFeedAd(adSlot, new TTAdNative.NativeExpressAdListener() {
@Override
public void onError(int code, String message) {
}
@Override
public void onNativeExpressAdLoad(List<TTNativeExpressAd> ads) {
}
});
模版banner
1.具体可以参看官网API文档中的 接入个性化模板Banner广告(接口同 TTNativeExpressAd) 也可参看官网demo中的BannerExpressActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadBannerExpressAd请求广告
模版信息流
1.具体可以参看官网API文档中的 接入个性化模板信息流广告(TTNativeExpressAd) 也可参看官网demo中的NativeExpressActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadNativeExpressAd请求广告
模版插屏
1.具体可以参看官网API文档中的 接入个性化模板插屏广告(接口同 TTNativeExpressAd) 也可参看官网demo中的InteractionExpressActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadInteractionExpressAd请求广告
4.新增 2.9.5.5版本之后的SDK 在onRenderSuccess回调方法中使用showInteractionExpressAd
渲染广告
模版draw
1.具体可以参看官网API文档中的 接入个性化模板Draw视频广告(接口同 TTNativeExpressAd) 也可参看官网demo中的DrawNativeExpressVideoActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadExpressDrawFeedAd请广告
模版激励视频
1.具体可以参看官网API文档中的 接入个性化模板激励视频广告(接口同 TTNativeExpressAd) 也可参看官网demo中的RewardVideoActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadRewardVideoAd请广告
4. 2.9.0.0sdk之后Android请求模板激励视频 必须设置setExpressViewAcceptedSize方法,宽高参数不为0即可
5.新增 3.3.0.0sdk版本 onRewardVerify
回调里新增code和message
6.新增 3.3.0.0sdk版本 setRewardName
和setRewardAmount
不生效 以平台创建代码位的时候填写的为主
7.新增 !!!切记 激励视频的展示showRewardVideoAd
放到主线程中进行处理 展示完广告之后及时把广告对象置空处理
模版全屏视频
1.具体可以参看官网API文档中的 接入个性化模板激励视频广告(接口同 TTNativeExpressAd) 也可参看官网demo中的FullScreenVideoActivity
2.目前所有的广告类型只能创建模版类型的 具体可以参看官网demo中带有Express的Activity
3.使用loadFullScreenVideoAd请广告
4. 2.9.0.0sdk之后Android请求模板全屏视频广告,必须设置setExpressViewAcceptedSize方法,宽高参数不为0即可
后续有什么问题 可以下方留言方便讨论!