Android端穿山甲SDK集成

Stella981
• 阅读 1028

Android端穿山甲SDK集成

SDK接入

  • 穿山甲平台上创建测试状态的应用ID和广告位ID (ps:测试集成完毕后再把应用及对应的代码位改成正式状态)
    (ps:应用ID和代码位ID是对应关系 一个应用可以对应多个代码位ID)
    应用ID 对应demo中的APPID
    广告位ID 对应demo中的CodeId
    Android端穿山甲SDK集成
    Android端穿山甲SDK集成

  • 将本SDK压缩包内的open_ad_sdk.aar添加到build.gradle中:

    repositories { flatDir { dirs 'libs' } } depedencies { compile(name: 'open_ad_sdk', ext: ‘aar') }

  • 添加权限

  • 适配Anroid7.0及以上
    注:主要是涉及到广告下载

在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以及以上版本

  • 运行环境配置

  • 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’ }

  • 初始化SDK
    在Application#onCreate()方法中调用以下代码来初始化穿山甲SDK。 SDK已支持多进程,如果明确某个进程不会使用到广告SDK,可以只针对特定进程初始化广告SDK
    注:TTAdManagerHolder保证处于单例状态

    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展示通知栏提示 .allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页 .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

加载广告

注:加载和展示广告都需要放到主线程中

  • 构建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)
    //激励视频奖励的名称,针对激励视频参数
    .setRewardName("金币")
    //激励视频奖励个数
    .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:模板类型的广告可以填写 以代码中填写的为主 激励视频和全屏视频必须填写这个部分)

广告类型

注:模板和非模板代码位的区分
可根据截图部分在平台上查看创建的代码位是否是模板 使用不同的方法获取广告
Android端穿山甲SDK集成
注:以下部分都是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 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 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 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 ads) { } });

后续有什么问题 可以下方留言方便讨论!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_