本文讲解下穿山甲广告接入的具体细节(如有不仔细的麻烦各位指出,定当万分感激)
实现功能:视频播放器首页加载开屏广告
工具:MacBook Air +Android Studio Narwhal 3 Feature Drop | 2025.1.3
代码环境:基于本人上一篇文章一个kotlin实现的视频播放器实现
穿山甲广告sdk加载的流程:
TTAdSdk.init(sdk初始化)->TTAdSdk.start(启动sdk)->loadSplashAd(加载广告)
具体代码流程
s'dk初始化
java
public static void init(final Context context) {
//初始化穿山甲SDK
doInit(context);
}
//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
private static void doInit(Context context) {
if (sInit) {
Toast.makeText(context, "您已经初始化过了", Toast.LENGTH_LONG).show();
return;
}
//TTAdSdk.init(context, buildConfig(context));
//setp1.1:初始化SDK
TTAdSdk.init(context, buildConfig(context));
sInit = true;
Toast.makeText(context, "初始化成功", Toast.LENGTH_LONG).show();
}
启动sdk
java
public static void start(Context context,TTAdSdk.Callback callback) {
if (!sInit) {
Toast.makeText(context, "还没初始化SDK,请先进行初始化", Toast.LENGTH_LONG).show();
return;
}
if (sStart) {
startActivity(context);
return;
}
//setp1.2:启动SDK
TTAdSdk.start(callback);
sStart = true;
}
TTAdManagerHolder.start(this, new TTAdSdk.Callback() {
@Override
public void success() {
Log.i(TAG, "success: " + TTAdSdk.isSdkReady());
//加载开屏广告
loadSplashAd();
}
@Override
public void fail(int code, String msg) {
TTAdManagerHolder.sStart = false;
Log.i(TAG, "fail: code = " + code + " msg = " + msg);
}
});
加载广告
java
/**
* 加载开屏广告
*/
private void loadSplashAd() {
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
float splashWidthDp = UIUtils.getScreenWidthDp(this);
int splashWidthPx = UIUtils.getScreenWidthInPx(this);
int screenHeightPx = UIUtils.getScreenHeight(this);
float screenHeightDp = UIUtils.px2dip(this, screenHeightPx);
float splashHeightDp;
int splashHeightPx;
if (mIsHalfSize) {
// 开屏高度 = 屏幕高度 - 下方预留的高度,demo中是预留了屏幕高度的1/5,因此开屏高 度传入 屏幕高度*4/5
splashHeightDp = screenHeightDp * 4 / 5.f;
splashHeightPx = (int) (screenHeightPx * 4 / 5.f);
} else {
splashHeightDp = screenHeightDp;
splashHeightPx = screenHeightPx;
}
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(mCodeId)
//模板广告需要设置期望个性化模板广告的大小,单位dp,代码位是否属于个性化模板广 告,请在穿山甲平台查看
//view宽高等于图片的宽高
.setExpressViewAcceptedSize(splashWidthDp, splashHeightDp) // 单位是 dp
.setImageAcceptedSize(splashWidthPx, splashHeightPx) // 单位是px
.build();
if (mTTAdNative == null) return;
//step4:请求广告,调用开屏广告异步请求接口,对请求回调的广告作渲染处理
final CSJSplashAd.SplashAdListener listener = new SplashAdListener(this);
mTTAdNative.loadSplashAd(adSlot, new TTAdNative.CSJSplashAdListener() {
@Override
public void onSplashLoadSuccess(CSJSplashAd ad) {
Log.e(TAG, "CSJActivity-onSplashLoadSuccess");
if (ad == null) {
return;
}
mSplashAd = ad;
if (mIsHalfSize) {
mSplashHalfSizeLayout.setVisibility(View.VISIBLE);
mSplashAd.showSplashView(mSplashSplashContainer);
mSplashContainer.setVisibility(View.GONE);
} else {
mSplashAd.showSplashView(mSplashContainer);
mSplashHalfSizeLayout.setVisibility(View.GONE);
}
}
@Override
public void onSplashLoadFail(CSJAdError error) {
Log.e(TAG, "CSJActivity-onSplashLoadFail, errorCode: " + error.getCode() + ", errorMsg: " + error.getMsg());
showToast(error.getMsg());
goToMainActivity();
}
@Override
public void onSplashRenderSuccess(CSJSplashAd ad) {
Log.e(TAG, "CSJActivity-onSplashRenderSuccess");
//设置SplashView的交互监听器
mSplashAd.setSplashAdListener(listener);
if (ad.getInteractionType() == TTAdConstant.INTERACTION_TYPE_DOWNLOAD) {
TTAppDownloadListener downloadListener = new SplashDownloadListener();
mSplashAd.setDownloadListener(downloadListener);
}
//初始化卡片开屏相关数据
SplashCardManager.getInstance().init(MainSplashActivity.this, mSplashAd, mSplashAd.getSplashView(), new SplashCardManager.Callback() {
@Override
public void onStart() {
// 当动画开始时回调,您可以在此处理渲染卡片背后的界面等操作
}
@Override
public void onClose() {
// 当卡片关闭时回调,您可以在这里处理Activity的关闭操作等
Intent intent = new Intent(MainSplashActivity.this, MainActivity.class);
startActivity(intent);
if (mSplashContainer != null) {
mSplashContainer.removeAllViews();
}
finish();
}
});
}
@Override
public void onSplashRenderFail(CSJSplashAd ad, CSJAdError csjAdError) {
Log.e(TAG, "CSJActivity-onSplashRenderFail, errorCode: " + csjAdError.getCode() + ", errorMsg: " + csjAdError.getMsg());
showToast(csjAdError.getMsg());
goToMainActivity();
}
}, AD_TIME_OUT);
}
接入步骤:
集成广告sdk->网络配置->动态权限配置->sdk包适配androidx->TTFileProvider配置->页面实现
(1)集成广告sdk(网络集成/本地集成)
1:本地集成:

implementation(files("libs/open_ad_sdk.aar"))
2:网络集成:
implementation("com.pangle.cn:ads-sdk-pro:7.3.0.8")
注意:sdk 7.3.0.8版本后才支持网络集成
(2)网络配置:
build.gradle.kts中添加如下:
implementation("com.squareup.okhttp3:okhttp:3.12.1")
AndroidMainfest.xml中APPlication属性添加如下:
android:networkSecurityConfig="@xml/network_config"
在res/xml/下添加network_config.xml文件
(3)动态权限配置
AndroidManifest.xml中添加如下权限:
java
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<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.CHANGE_NETWORK_STATE" />
<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.VIBRATE" /> <!-- suppress DeprecatedClassUsageInspection -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission
android:name="android.permission.WAKE_LOCK"
tools:node="remove" /> <!-- 可选,穿山甲提供"获取地理位置权限"和"不给予地理位置权限,开发者传入地理位置参数"两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告 -->
<!-- 请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息 -->
<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" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /><!-- 建议添加"POST_NOTIFICATIONS"权限。在Android 13系统上下载类广告发送通知使用 -->
动态申请权限(sdk封装):
TTAdManagerHolder.get().requestPermissionIfNecessary(this)
(4)sdk包适配androidx
因为该sdk包包含v4包api,所有在新版本androidx中需要适配,修改如下:
gradle.properties文件添加属性:
android.enableJetifier=true
(5)TTFileProvider配置(AndroidManifest.xml中添加)
java
<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>
(6)页面实现:自行查看代码,这里不做说明
页面显示:

代码地址 :https://gitee.com/daxiangzaici/kt-media-player.git
注意:这里广告sdk添加是基于上一遍文章一个kotlin实现的视频播放器 实现,如果不需要集成广告版本的sdk,请git切换至上一个版本