SDK接入
穿山甲平臺(tái)上創(chuàng)建測試狀態(tài)的應(yīng)用ID和廣告位ID (ps:測試集成完畢后再把應(yīng)用及對(duì)應(yīng)的代碼位改成正式狀態(tài))(ps:應(yīng)用ID和代碼位ID是對(duì)應(yīng)關(guān)系 一個(gè)應(yīng)用可以對(duì)應(yīng)多個(gè)代碼位ID)應(yīng)用ID 對(duì)應(yīng)demo中的APPID廣告位ID 對(duì)應(yīng)demo中的CodeId?
1.導(dǎo)入 aar 及 SDK 依賴的 jar 包
將本 SDK 壓縮包內(nèi)的 open_ad_sdk.aar 復(fù)制到 Application Module/libs 文件夾(沒有的話須手動(dòng)創(chuàng)建), 并將以下代碼添加到您 app 的
android{
repositories {
? ? flatDir {
? ? ? ? dirs 'libs'
? ? }
}
depedencies {
? ? //穿山甲SDK
implementation(name:'open_ad_sdk',ext:'aar')
}
2.添加權(quán)限
穿山甲SDK建議您添加下述權(quán)限藕施,并建議在您的隱私協(xié)議中向開發(fā)者聲明穿山甲SDK會(huì)獲取下述權(quán)限并應(yīng)用于廣告投放谈为。
<!--必要權(quán)限-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--可選權(quán)限-->
<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"/>
<!--可選越败,穿山甲提供“獲取地理位置權(quán)限”和“不給予地理位置權(quán)限,開發(fā)者傳入地理位置參數(shù)”兩種方式上報(bào)用戶位置,兩種方式均可不選,添加位置權(quán)限或參數(shù)將幫助投放定位廣告-->
<!--請(qǐng)注意:無論通過何種方式提供給穿山甲用戶地理位置倦逐,均需向用戶聲明地理位置權(quán)限將應(yīng)用于穿山甲廣告投放,穿山甲不強(qiáng)制獲取地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 如果有視頻相關(guān)的廣告且使用textureView播放宫补,請(qǐng)務(wù)必添加檬姥,否則黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
注意:穿山甲SDK不強(qiáng)制獲取以上權(quán)限,即使沒有獲取可選權(quán)限SDK也能正常運(yùn)行粉怕;獲取以上權(quán)限將幫助穿山甲優(yōu)化投放廣告精準(zhǔn)度和用戶的交互體驗(yàn)健民,提高eCPM。
適配 Android7.0 及以上
如果您的應(yīng)用需要在 Android7.0 及以上環(huán)境運(yùn)行贫贝,請(qǐng)?jiān)?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 目錄下秉犹,新建一個(gè) xml 文件 file_paths,在該文件中添加如下代碼:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
? ? <!--為了適配所有路徑可以設(shè)置 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步下邊就可以? )
注意:單進(jìn)程或多進(jìn)程都必須配置
<provider
? ? android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
? ? android:authorities="${applicationId}.TTMultiProvider"
? ? android:exported="false" />
SDK中使用的so文件支持五種架構(gòu):x86,x86_64,armeabi,armeabi-v7a,arm64-v8a 如果您應(yīng)用中支持的架構(gòu)超出這 五種稚晚,請(qǐng)?jiān)赽uild.gradle中使用abiFilters選擇支持的架構(gòu)崇堵。
android {
????defaultConfig {
????????????ndk{????
????????????????// 設(shè)置支持的 SO 庫構(gòu)架,注意這里要根據(jù)你的實(shí)際情況來設(shè)置?
????????????????abiFilters'armeabi-v7a','arm64-v8a','x86','x86_64','armeabi'
????????????????????}
????????????}
????}
5.初始化SDK(這是一個(gè)類)
/**
* 可以用一個(gè)單例來保存TTAdManager實(shí)例客燕,在需要初始化sdk的時(shí)候調(diào)用
*/
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:接入網(wǎng)盟廣告sdk的初始化操作鸳劳,詳情見接入文檔和穿山甲平臺(tái)說明
? ? private static void doInit(Context context) {
? ? ? ? if (!sInit) {
? ? ? ? ? ? TTAdSdk.init(context, buildConfig(context));
? ? ? ? ? ? sInit = true;
? ? ? ? }
? ? }
// 1. 初始化SDK時(shí)需要包含APPID,播放器幸逆,appname棍辕,通知欄提示暮现,debug狀態(tài)还绘,網(wǎng)絡(luò)狀態(tài)等信息
// 2. 如果是多進(jìn)程的話楚昭,需要在每個(gè)請(qǐng)求廣告的子進(jìn)程都進(jìn)行初始化設(shè)置
? ? private static TTAdConfig buildConfig(Context context) {
? ? ? ? return new TTAdConfig.Builder()
? ? ? ? ? ? ? ? .appId("5001121")
? ? ? ? ? ? ? ? .useTextureView(true) //使用TextureView控件播放視頻,默認(rèn)為SurfaceView,當(dāng)有SurfaceView沖突的場景,可以使用TextureView
? ? ? ? ? ? ? ? .appName("應(yīng)用id")
? ? ? ? ? ? ? ? .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
? ? ? ? ? ? ? ? .allowShowNotify(true) //是否允許sdk展示通知欄提示
? ? ? ? ? ? ? ? .allowShowPageWhenScreenLock(true) //是否在鎖屏場景支持展示廣告落地頁
? ? ? ? ? ? ? ? .debug(true) //測試階段打開拍顷,可以通過日志排查問題抚太,上線時(shí)去除該調(diào)用
? ? ? ? ? ? ? ? .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允許直接下載的網(wǎng)絡(luò)狀態(tài)集合
? ? ? ? ? ? ? ? .supportMultiProcess(false)//是否支持多進(jìn)程
? ? ? ? ? ? ? ? //.httpStack(new MyOkStack3())//自定義網(wǎng)絡(luò)庫,demo中給出了okhttp3版本的樣例昔案,其余請(qǐng)自行開發(fā)或者咨詢工作人員尿贫。
? ? ? ? ? ? ? ? .build();
? ? }
}
在Application中調(diào)用
public class MyApp extends Application {
? ? @Override
? ? public void onCreate() {
? ? ? ? super.onCreate();
? ? ? ? // 穿山甲SDK初始化
? ? ? ? // 強(qiáng)烈建議在應(yīng)用對(duì)應(yīng)的Application#onCreate()方法中調(diào)用,避免出現(xiàn)content為null的異常
? ? ? ? TTAdManagerHolder.init(this);
? ? ? ? //如果明確某個(gè)進(jìn)程不會(huì)使用到廣告SDK踏揣,可以只針對(duì)特定進(jìn)程初始化廣告SDK的content
? ? ? ? //if (PROCESS_NAME_XXXX.equals(processName)) {
? ? ? ? //? TTAdManagerHolder.init(this)
? ? ? ? //}
? ? }
}
6.展示廣告(激勵(lì)視頻TTRewardVideoAd)
TTAdManager ttAdManager = TTAdManagerHolder.get();
TTAdNative mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
AdSlot adSlot =new AdSlot.Builder()
.setCodeId("廣告位id")
.setSupportDeepLink(true)
.setAdCount(2)
//個(gè)性化模板廣告需要設(shè)置期望個(gè)性化模板廣告的大小,單位dp,激勵(lì)視頻場景庆亡,只要設(shè)置的值大于0即可。僅模板廣告需要設(shè)置此參數(shù)
? ? ? ? .setExpressViewAcceptedSize(500, 500)
.setImageAcceptedSize(1080, 1920)
.setRewardName("金幣")//獎(jiǎng)勵(lì)的名稱
? ? ? ? .setRewardAmount(3)//獎(jiǎng)勵(lì)的數(shù)量
? ? ? ? //必傳參數(shù)捞稿,表來標(biāo)識(shí)應(yīng)用側(cè)唯一用戶又谋;若非服務(wù)器回調(diào)模式或不需sdk透傳
? ? ? ? //可設(shè)置為空字符串
? ? ? ? .setUserID("user123")
.setMediaExtra("media_extra")//用戶透傳的信息,可不傳
? ? ? ? .build();
7.視頻回調(diào)
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {
@Override
? ? ? ? ? public void onError(int i, String s) {
//開屏廣告請(qǐng)求失敗
? ? ? ? ? }
@Override
? ? ? ? ? public void onRewardVideoAdLoad(TTRewardVideoAd ttRewardVideoAd) {
ttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {
@Override
? ? ? ? ? ? ? ? ? public void onAdShow() {
showToast("播放完視屏即可簽到領(lǐng)獎(jiǎng)");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onAdVideoBarClick() {
showToast("開始下載");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onAdClose() {
showToast("關(guān)閉廣告");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onVideoComplete() {
showToast("視頻完成");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onVideoError() {
//? ? ? ? ? ? ? ? ? ? ? showToast("視頻錯(cuò)誤");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onRewardVerify(boolean b, int i, String s) {
//? ? ? ? ? ? ? ? ? ? ? showToast("視頻異常");
? ? ? ? ? ? ? ? ? }
@Override
? ? ? ? ? ? ? ? ? public void onSkippedVideo() {
showToast("跳過視頻");
? ? ? ? ? ? ? ? ? }
});
? ? ? ? ? ? ? ttRewardVideoAd.showRewardVideoAd(FoundSignActivity.this);
? ? ? ? ? }
@Override
? ? ? ? ? public void onRewardVideoCached() {
}
});