以下文档主要针对安卓开发者对接参考,通常仅针对原生开发或者kotlin开发参考,但对flutter也有一定参考意义。 下载android对接sdk-  下载demo,若下载失败,请问客服索取。

android快速接入

支持的广告类型

激励视频广告

通过应用内奖励吸引用户主动选择观看的全屏视频形式广告,用户获得应用内奖励的同时,开发者获得丰厚变现收益。
常见场景: 常见展示于获取应用内奖励及权益体系的所有应用及场景支持格式: 15~30秒竖版视频、横版视频

信息流广告

契合应用原生环境的广告样式,提供浑然一体的用户体验,助您最大程度获取收益。目前穿山甲提供8套通用模版,开发者可根据应用风格选择模版,并自定义调整细节设计。
常见场景: 资讯页、视频详情页、信息列表页等
支持格式: 横版视频、单图、组图
样式尺寸: 宽高比1:1.78,1: 1.52

全屏视频广告

全屏播放的视频广告,5秒可跳过,高收益的同时兼顾用户感受。
常见场景: 小说翻页、操作完成页、游戏结束页、视频结束页等
支持格式: 15~30秒竖版视频、横版视频

开屏广告

应用开屏黄金展示位,头部品牌广告主青睐样式,广告填充率、点击率更高。
常见场景: 所有应用的启动页,app启动时,常会使用开屏广告。
支持格式: 图片、视频
样式尺寸: 宽高比9:16

横幅广告

APP界面顶部、中部或底部展现的多形态广告样式
常见场景: 任意界面的固定位置, 资讯阅读页、视频播放页、工具功能页、游戏页等的顶部、中部、底部
支持类型: 静态图、GIF图、轮播图、文字

短视频广告

类似抖音视频、快手视频的竖版视频信息流,与视频产品完全融为一体,亦可作为单独的页面丰富APP产品
常见场景: 单独导航并展示短视频广告、视频类产品内容独立页、视频类产品打开APP时展示皆可

插屏广告

适用于所有具有广告弹出的场景;在应用开启、暂停、退出等节点,以半屏或全屏的形式弹出展示,充分渗透用户等待时间,拥有强信息表现力。
常见场景: 在应用执行流程的自然停顿点,适合投放这类广告。视频贴片、弹窗场景等
支持格式: 静态图、GIF图
样式尺寸: 宽高比1:1,3:2,2:3

1.  开发环境与准备工作

使用 AndroidStudio 开发环境,推荐AndroidStudio 4.0 以上,推荐gradle:4.0.0 以上; 【最低支持gradle:3.6.4】

2.  导入SDK

下载后的 ../libs 文件目录下有所需要的所有依赖包。将所需要的aar、jar包拷⻉到 libs ⽬录下,其中*voice_*.aar非必须包, *fastjson*.jar若项目内已有,请选择高版本的避免重复与冲突。

3.  build.gradle 配置

                                                    
                                                        android {
                                                            //...
                                                            defaultConfig {
                                                                    minSdkVersion 21
                                                                    multiDexEnabled true
                                                            }

                                                            compileOptions {
                                                                sourceCompatibility JavaVersion.VERSION_1_8
                                                                targetCompatibility JavaVersion.VERSION_1_8
                                                            }
                                                            //...
                                                        }
                                                        //添加依赖库⽬录
                                                        repositories {
                                                            flatDir {
                                                                dirs 'libs'
                                                            }
                                                        }
                                                        dependencies {
                                                            //广告添加相关依赖包
                                                            implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])//导入广告相关aar和jar包
                                                            implementation "com.android.support:design:28.0.0"
                                                            implementation 'com.android.support:multidex:1.0.3'
                                                            implementation 'com.github.bumptech.glide:glide:4.9.0'
                                                            implementation 'com.google.code.gson:gson:2.8.5' //若没有 则添加,避免冲突不要反复引入
                                                            //implementation "androidx.legacy:legacy-support-v4:1.0.0"//加入 AndroidX V4 依赖支持库

                                                            //GroMore_sdk
                                                            implementation "com.pangle.cn:mediation-sdk:5.6.1.6"
                                                        }

                                                    
                                                

build.gradle 示例

                                                    
                                                        apply plugin: 'com.android.application'

                                                        android {
                                                            compileOptions {
                                                                sourceCompatibility JavaVersion.VERSION_1_8
                                                                targetCompatibility JavaVersion.VERSION_1_8
                                                            }

                                                            compileSdkVersion 28

                                                            defaultConfig {
                                                                applicationId "com.soyea.ryc.test"
                                                                minSdkVersion 21
                                                                targetSdkVersion 28
                                                                versionCode 99999
                                                                versionName "20.0.0"
                                                                multiDexEnabled true
                                                            }

                                                            buildTypes {
                                                                release {
                                                                    minifyEnabled true
                                                                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                                                                }
                                                                debug {
                                                                    minifyEnabled true
                                                                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                                                                }
                                                            }

                                                            signingConfigs {
                                                                releaseConfig {
                                                                    storeFile file("ryc.jks")
                                                                    storePassword '123456'
                                                                    keyAlias = 'ryc'
                                                                    keyPassword '123456'
                                                                }
                                                                debug {
                                                                    storeFile file("ryc.jks")
                                                                    storePassword '123456'
                                                                    keyAlias = 'ryc'
                                                                    keyPassword '123456'
                                                                }
                                                            }
                                                        }

                                                        //添加依赖库⽬录
                                                        repositories {
                                                            flatDir {
                                                                dirs 'libs'
                                                            }
                                                        }

                                                        dependencies {
                                                            implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])

                                                            implementation 'com.android.support:support-v4:28.0.0'
                                                            implementation 'com.android.support:recyclerview-v7:28.0.0'
                                                            implementation 'com.android.support:appcompat-v7:28.0.0'
                                                            implementation 'com.android.support:design:28.0.0'

                                                            implementation 'com.scwang.smart:refresh-layout-kernel:2.0.1'
                                                            implementation 'com.scwang.smart:refresh-header-classics:2.0.1'    //经典刷新头
                                                            implementation 'com.scwang.smart:refresh-footer-classics:2.0.1'    //经典加载
                                                            implementation 'com.github.bumptech.glide:glide:4.9.0'

                                                            //添加相关依赖包
                                                            implementation 'com.android.support:multidex:1.0.3'
                                                            //implementation "androidx.legacy:legacy-support-v4:1.0.0"//加入 AndroidX V4 依赖支持库

                                                            //语音红包 必要的第三方库支持
                                                            implementation 'com.squareup.retrofit2:retrofit:2.2.0'
                                                            implementation 'com.squareup.retrofit2:converter-gson:2.2.0'
                                                            implementation 'com.google.code.gson:gson:2.8.5'
                                                            implementation 'com.github.bumptech.glide:glide:4.9.0'
                                                            implementation 'com.liulishuo.filedownloader:library:1.7.7'
                                                            implementation ('com.google.android.exoplayer:exoplayer-core:2.15.1') { //非必须
                                                                exclude group: "androidx.annotation", module: "annotation"
                                                            }
                                                            implementation 'com.android.support.constraint:constraint-layout:2.0.4'//如果您的项目中没有用到约束布局,需要添加该依赖

                                                            //多量
                                                            // 如果你的appcompat用的是1.1.0以上版本,请自动集成 swiperefreshlayout:1.1.0
                                                            //implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
                                                            //implementation(name: 'dy-task-sdk-2.2.9', ext: 'aar')
                                                        }

                                                    
                                                

4.  AndroidManifest.xml 配置

                                                
                                                    
                                                    
                                                    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                                                              xmlns:tools="http://schemas.android.com/tools"
                                                              package="com.anythink.sdk">
                                                    <uses-permission android:name="android.permission.INTERNET" />
                                                    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
                                                    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
                                                    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
                                                    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
                                                    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
                                                    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
                                                    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
                                                    <uses-permission android:name="android.permission.GET_TASKS" />
                                                    <uses-permission android:name="android.permission.WAKE_LOCK" />
                                                    <application>
                                                        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
                                                        <provider
                                                                android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
                                                                android:authorities="${applicationId}.TTMultiProvider"
                                                                android:exported="false" />
                                                        <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/alex_tt_file_path" />
                                                        </provider>
                                                        <!-- source file: china/network_sdk/gdt/4.542.1412/AndroidManifest.xml -->

                                                        <provider
                                                                android:name="com.qq.e.comm.GDTFileProvider"
                                                                android:authorities="${applicationId}.gdt.fileprovider"
                                                                android:exported="false"
                                                                android:grantUriPermissions="true">
                                                        <meta-data
                                                                android:name="android.support.FILE_PROVIDER_PATHS"
                                                                android:resource="@xml/anythink_bk_gdt_file_path" />
                                                        </provider>
                                                    </application>
                                                </manifest>

                                                
                                                

重要提示

SDK不强制校验上述权限(即:无上述权限sdk也可正常工作),但建议您申请上述权限(有利收益) 媒体可以选择不添加上述权限,并承担相应广告填充和eCPM单价下降损失的结果。

5.  接入代码-SDK初始化

重要提示

强烈建议在应用对应的Application#onCreate()方法中调用,避免出现content为null的异常
                                                
                                                    public class App extends Application {

                                                        @Override
                                                        public void onCreate() {
                                                            super.onCreate();
                                                            if (!SharedPreferencesUtils.getIsFirstInit(this.getApplicationContext())) {
                                                                //String currentProcessName = AppUtils.getCurrentProcessName(this);//当前进程名
                                                                initOaid();
                                                                initBaiyi();
                                                            }
                                                        }

                                                        //广告初始化【ByManager.init】之前执行oaid_sdk初始化操作
                                                        private void initOaid() {
                                                            //System.loadLibrary("msaoaidsec");
                                                            int code = com.bun.miitmdid.core.MdidSdkHelper.InitSdk(this, true,
                                                                    new com.bun.miitmdid.interfaces.IIdentifierListener() {
                                                                        @Override
                                                                        public void OnSupport(boolean b, com.bun.miitmdid.interfaces.IdSupplier idSupplier) {

                                                                        }
                                                                    });
                                                        }

                                                        //SDK初始化
                                                        private void initBaiyi() {
                                                            ByInitConfig config = new ByInitConfig.Builder()
                                                                    .appId("平台上申请的媒体ID")//初始化id就是媒体审核通过后的媒体编号,请在我的媒体中查看
                                                                    .build();
                                                            ByManager.init(this, config, new ByManager.IsInitListener() {
                                                                @Override
                                                                public void onFail(String s) {

                                                                }

                                                                @Override
                                                                public void onSuccess() {
                                                                    //打印输出日志,查看是否初始化成功
                                                                }
                                                            });
                                                        }

                                                        //debug调试Toast
                                                        private void debug_toast() {
                                                            if (AppUtils.isApkInDebug(this)) {
                                                                TToast.initToast(this);
                                                            }
                                                            //TToast.reset();
                                                        }

                                                        @Override
                                                        protected void attachBaseContext(android.content.Context base) {
                                                            super.attachBaseContext(base);
                                                            MultiDex.install(this);
                                                        }
                                                    }
                                                
                                                

6.  接入代码-动态权限

最佳实践

动态权限请在App的入口Activity中的onCreate调用相关代码
                                                
                                                    RequestPermission.RequestPermissionIfNecessary(this);
                                                
                                                

7.  接入示例-开屏广告

最佳实践

1. Sdk初始化之后,请延迟1s后执行调用开屏广告的方法 2. 开屏广告的内容展示通常是链类广告和app类广告,链类广告会跳转到广告落地页,而app类广告则只会下载app 3. 通常切换应用到后台再重新回到应用的时间间隔超过一定时间后,可再次调用开屏广告以增加开屏广告的曝光 4. 通常是设置一个变量作为是否跳转到应用主页,onDismiss() 回调里判断是否可以跳转到主页,Activity#onResume() 再次判断是否可以跳转 且将变量设置为可跳转,Activity#onPause() 将变量设置为不可跳转;
                                                
                                                    BySplashConfig config = new BySplashConfig.Builder()
                                                            .codeId("广告位id")//平台申请的广告位id
                                                            .container(mSplashContainer)//承载视图的容器。可⾃定义⾼度⽐例,但不能低于0.75
                                                            .build();

                                                    ByManager.loadSplash(config, this, new ByManager.SplashLoadListener() {
                                                        @Override
                                                        public void onFail(String s) { //广告加载失败回调
                                                            Toast.makeText(SplashActivity.this, s, Toast.LENGTH_SHORT).show();  //本段代码作为提示用,线上广告加载不出来一般不提示给用户,仅在开发阶段调用
                                                            mSplashContainer.removeAllViews();
                                                            finish();
                                                        }

                                                        @Override
                                                        public void onDismiss() {
                                                            mSplashContainer.removeAllViews();
                                                            finish();
                                                        }
                                                    });

                                                
                                                
方法名 说明
onFail(String msg) 开屏广告加载失败,msg加载失败说明( 如果重复请求,请做好次数和间隔限制,千万不要错误之后无限请求
onExposure() 开屏广告渲染成功
onClicked() 开屏广告被点击
onDismiss() 开屏广告关闭

8.  接入示例-插屏广告+全屏视频广告

友情提示

插屏广告和全屏视频类广告为同一方法进行调用,传递的广告位ID若是插屏类,则显示插屏,若是全屏视频广告位ID,则显示全屏视频广告
                                                
                                                    ByInteractionConfig config = new ByInteractionConfig.Builder()
                                                            .codeId("广告位id")//平台申请的广告位id
                                                            .build();

                                                    ByManager.loadInteraction(config, this, new ByManager.InteractionLoadListener() {
                                                        @Override
                                                        public void onFail(String s) {
                                                            //Toast.makeText(InteractionActivity.this, s, Toast.LENGTH_SHORT).show();
                                                        }

                                                        @Override
                                                        public void onDismiss() {

                                                        }

                                                        @Override
                                                        public void onVideoReady() {

                                                        }

                                                        @Override
                                                        public void onVideoComplete() {

                                                        }
                                                    });
                                                
                                                
方法名 说明
onFail(String msg) 广告加载失败,msg加载失败说明( 如果重复请求,请做好次数和间隔限制,千万不要错误之后无限请求
onExposure() 广告渲染成功
onClicked() 广告被点击
onDismiss() 广告关闭
onVideoReady() 视频准备就绪开始播放(非视频广告不回调,通常是全屏视频类广告适用)
onVideoComplete() 视频播放完成(非视频广告不回调,通常是全屏视频类广告适用)

9.  接入示例-banner广告

友情提示

在pv值相对比较高的页面放入banner广告比较合适
                                                
                                                    ByBannerConfig config = new ByBannerConfig.Builder()
                                                            .codeId("广告位id")//平台申请的广告位id
                                                            .viewWidth(350)//期望模板view的width(height自适应),默认值350(单位dp)
                                                            .container(mBannerContainer)//承载视图的容器
                                                            .build();

                                                    ByManager.loadBanner(config, this, new ByManager.BannerLoadListener() {
                                                        @Override
                                                        public void onFail(String s) {
                                                            //加载失败
                                                            //Toast.makeText(BannerActivity.this, s, Toast.LENGTH_SHORT).show();
                                                        }

                                                        @Override
                                                        public void onDismiss() {
                                                            //关闭
                                                        }
                                                    });

                                                
                                                
方法名 说明
onFail(String msg) 广告加载失败,msg加载失败说明( 如果重复请求,请做好次数和间隔限制,千万不要错误之后无限请求
onExposure() 广告渲染成功
onClicked() 广告被点击
onDismiss() 广告关闭

10.  接入示例-模板信息流广告

友情提示

在pv值高的页面放入信息流广告也相对比较合适,且通常单价优于banner广告,若是详情页内页广告,通常优先考虑信息流而非banner广告。
                                                
                                                    ByFeedConfig config = new ByFeedConfig.Builder()
                                                            .codeId("广告位id")//平台申请的广告位id
                                                            .viewWidth(width)//期望模板view的width,默认值350(单位dp)
                                                            .viewHigh(height)//期望模板view的height,默认值0(自适应,单位dp)
                                                            .build();

                                                    ByManager.loadFeed(config, this, new ByManager.FeedLoadListener() {
                                                        @Override
                                                        public void onFail(String s) {
                                                            //加载失败
                                                            Toast.makeText(FeedActivity.this, s, Toast.LENGTH_SHORT).show();
                                                        }

                                                        @Override
                                                        public void onLoad(FeedPosition position) {
                                                            //显示信息流
                                                            position.showFeed(FeedActivity.this, container); //container承载视图的容器
                                                        }

                                                        @Override
                                                        public void onDismiss() {
                                                            //关闭
                                                        }

                                                        @Override
                                                        public void onVideoReady() {
                                                            //视频准备就绪开始播放(非视频不回调)
                                                        }

                                                        @Override
                                                        public void onVideoComplete() {
                                                            //视频播放完成(非视频不回调)
                                                        }
                                                    });


                                                
                                                
方法名 说明
onFail(String msg) 广告加载失败,msg加载失败说明( 如果重复请求,请做好次数和间隔限制,千万不要错误之后无限请求
onLoad(FeedPosition position) 素材请求成功后返回广告对象FeedPosition,通过position.showFeed(activity, container)来展现广告sssss
onExposure() 广告曝光
onClicked() 广告被点击
onDismiss() 广告关闭
onVideoReady() 视频准备就绪开始播放(非视频广告不回调)
onVideoComplete() 视频播放完成(非视频广告不回调)

11.  接入示例-激励视频广告

友情提示

激励视频需要有加载中的弹框提示,防止用户再次重复的点击,具体可以参考demo中的实现,自己实现一定要考虑到重复点击,因为激励视频的素材加载通常会有一定延迟。 激励视频回调支持客户端回调可服务端回调2种方法,通常
                                                

                                                    ByRewardVideoConfig config = new ByRewardVideoConfig.Builder()
                                                                    .codeId("广告位id")//平台申请的广告位id
                                                                    .userId("userId")//必填参数,用户ID或者设备唯一标识(服务器回调时也需要),主要用于服务器回调发送通知时使用,若仅是客户端回调,则随便填写一个固定值即可
                                                                    .orientation(orientation)//必填参数,期望视频的播放方向:VIDEO_HORIZONTAL 或 VIDEO_VERTICAL
                                                                    .build();

                                                            ByManager.loadRewardVideo(config, this, new ByManager.RewardVideoLoadListener() {
                                                                @Override
                                                                public void onFail(String s) {
                                                                    //加载失败
                                                                    progressBar.setVisibility(View.GONE);//加载中弹窗隐藏
                                                                    //Toast.makeText(RewardVideoActivity.this, s, Toast.LENGTH_SHORT).show();
                                                                }

                                                                @Override
                                                                public void onExposure(String orderNo) {
                                                                    //如果使用服务器回调,可以将orderNo传给自己服务器来做后续的判断,也可以直接根据服务器回调直接发放奖励。
                                                                    //progressBar为加载组件
                                                                    progressBar.setVisibility(View.GONE);//加载中弹窗隐藏
                                                                }

                                                                @Override
                                                                public void onClose() {
                                                                    //视频被关闭
                                                                }

                                                                @Override
                                                                public void onRewardVideoCached(RewardPosition position) {
                                                                    //视频加载完成,此时播放视频不卡顿(立即播放没有此回调)
                                                                    ByManager.playRewardVideo(this, position);  //播放视频广告
                                                                }

                                                                @Override
                                                                public void onRewardVerify() {
                                                                    //激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
                                                                    //给与用户奖励相关代码
                                                                }
                                                            });
                                                
                                                
方法名 说明
onFail(String msg) 广告加载失败,msg加载失败说明( 如果重复请求,请做好次数和间隔限制,千万不要错误之后无限请求
onExposure(String orderNo) 视频广告曝光(如果使用服务器回调,需要将orderNo传给自己服务器)
onClick() 视频被点击
onClose() 视频被关闭
onRewardVideoCached(RewardPosition position) 视频广告加载完成,此时播放视频不卡顿
onRewardVerify() 激励视频触发激励(观看视频大于一定时长或者视频播放完毕时触发)

12.  接入示例-短视频广告

友情提示

短视频是一个整体模块,提供泛内容的视频功能,通常建议在独立导航的页面进行展示
                                                
                                                    ByVideoManager.replaceFrameLayout4Video(activity, "广告位ID", "", "", object : ByVideoManager.IReplaceListener {
                                                        override fun onFail(s: String) {
                                                                //短视频加载失败
                                                        }

                                                        override fun getContentPage(contentPage: KsContentPage) {
                                                            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, contentPage.getFragment()).commitAllowingStateLoss();
                                                        }

                                                        override fun onVideoPlayStart(videoTypeEnum: VideoTypeEnum) {
                                                            //视频开始播放
                                                        }

                                                        override fun onVideoPlayPaused(videoTypeEnum: VideoTypeEnum) {
                                                            //暂停
                                                        }

                                                        override fun onVideoPlayResume(videoTypeEnum: VideoTypeEnum) {
                                                            //继续播放
                                                        }

                                                        override fun onVideoPlayCompleted(videoTypeEnum: VideoTypeEnum) {
                                                            //播放完成
                                                        }

                                                        override fun onPageLeave(videoTypeEnum: VideoTypeEnum) {
                                                            //离开
                                                        }

                                                    })

                                                
                                                
帮助指南

如果您的问题是我们在线文档无法解决的,请直接联系专属商务,优先推荐您通过 常见问题解答找到答案

在线问题解答是大部分人都会比较关键并且我们已经做出官方的解释,您或许可以在常见问题解答快速的找到答案
立即联系在线客服
在线文档和视频教程
如果您对广告还不太了解,可以通过我们的在线教程快速普及一些基础知识
android_SDK集成
如果您是安卓开发者,可以在这里快速找到对接文档和一些经典对接案例
ios_SDK集成
如果您是ios开发者,可以在这里快速找到对接文档和一些经典对接案例
提现与账户
如果您对数据、提现等问题有任何疑惑,或许可以在这里找到答案