Android开发接入穿山甲广告SDK
Android接入穿山甲sdk还是比较简单,穿山甲sdk很多都封装好了。
你们也可以直接去下载它的demo参考
第一步:初始化sdk
public class TTAdManagerHolder {
private static final String TAG = "TTAdManagerHolder";
public static boolean sInit;
public static boolean sStart;
public static TTAdManager get() {
return TTAdSdk.getAdManager();
}
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;
start();
//Toast.makeText(context, "初始化成功", Toast.LENGTH_LONG).show();
}
public static void start() {
if (!sInit) {
//Toast.makeText(context, "还没初始化SDK,请先进行初始化", Toast.LENGTH_LONG).show();
return;
}
if (sStart) {
return;
}
//setp1.2:启动SDK
TTAdSdk.start(new TTAdSdk.Callback() {
@Override
public void success() {
Log.i(TAG, "success: " + TTAdSdk.isSdkReady());
}
@Override
public void fail(int code, String msg) {
sStart = false;
Log.i(TAG, "fail: code = " + code + " msg = " + msg);
}
});
sStart = true;
}
private static TTAdConfig buildConfig(Context context) {
return new TTAdConfig.Builder()
/**
* 注:需要替换成在媒体平台申请的appID ,切勿直接复制
*/
// // 5001121 是穿山甲demo的,5643182是测试的
.appId(BuildConfig.DEBUG?"5643182":BuildConfig.CSJ_APP_ID)
.appName(context.getString(R.string.app_name))
/**
* 上线前需要关闭debug开关,否则会影响性能
*/
.debug(false)
/**
* 使用聚合功能此开关必须设置为true,默认为false
*/
.useMediation(false)
.customController(getTTCustomController()) //如果您需要设置隐私策略请参考该api
// .setMediationConfig(new MediationConfig.Builder() //可设置聚合特有参数详细设置请参考该api
// .setMediationConfigUserInfoForSegment(getUserInfoForSegment())//如果您需要配置流量分组信息请参考该api
// .build())
.build();
}
//函数返回值表示隐私开关开启状态,未重写函数使用默认值
private static TTCustomController getTTCustomController(){
return new TTCustomController() {
@Override
public boolean isCanUseWifiState() {
return false;
}
@Nullable
@Override
public String getDevImei() {
return "";
}
@Override
public String getMacAddress() {
return "";
}
@Override
public boolean isCanUseWriteExternal() {
return super.isCanUseWriteExternal();
}
@Override
public String getDevOaid() {
LogUtils.i("oaid1", MyApplication.getInstance().oaid);
return super.getDevOaid();
}
@Override
public boolean isCanUseAndroidId() {
return false;
}
@Nullable
@Override
public LocationProvider getTTLocation() {
return null;
}
@Override
public boolean alist() {
return false;
}
@Override
public boolean isCanUsePhoneState() {
return false;
}
@Override
public String getAndroidId() {
return "";
}
@Override
public boolean isCanUseLocation() {
return false;
}
@Override
public MediationPrivacyConfig getMediationPrivacyConfig() {
return new MediationPrivacyConfig() {
@Override
public boolean isLimitPersonalAds() {
return super.isLimitPersonalAds();
}
@Override
public boolean isProgrammaticRecommend() {
return super.isProgrammaticRecommend();
}
};
}
};
}
}
你在同意隐私政策后调init方法即可
第二步:去穿山甲平台申请广告位代码
自己去申请了,很简单
第三步:展示开屏广告:
/**
* @author :congge
* @date : 2024-12-27 16:13
* @desc : 开屏广告
**/
public class AdStartupActivity extends BaseActivity<AdIIView, AdPresenter> implements AdIIView {
private static final String TAG = "SplashActivity";
public static final String START_UP_TYPE = "0";
public static final String SIGN_TYPE = "1";
public static final String LOOK_AD_TYPE = "2";
public static final String MOOD_TYPE = "3";
public static final String PHOTO_TYPE = "4";
private TTAdNative mTTAdNative;
private FrameLayout mSplashContainer;
//是否强制跳转到主页面
private boolean mForceGoMain;
//开屏广告加载超时时间,建议大于3000,这里为了冷启动第一次加载到广告并且展示,示例设置了3000ms
private static final int AD_TIME_OUT = 3000;
private String mCodeId = "";
private CSJSplashAd mSplashAd;
// 来源:0启动页 1签到,2看广告,领金币,3动态,4相册
private String fromType;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initHeadView(R.layout.activity_ad_splash, false);
showRealView();
}
@Override
protected void onResume() {
//判断是否该跳转到主页面
if (mForceGoMain) {
goToMainActivity();
}
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
mForceGoMain = true;
}
@Override
protected void initRealView(View view) {
super.initRealView(view);
mSplashContainer = (FrameLayout) findViewById(R.id.splash_container);
//step2:创建TTAdNative对象
mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
getExtraInfo();
//在合适的时机申请权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题
//在开屏时候申请不太合适,因为该页面倒计时结束或者请求超时会跳转,在该页面申请权限,体验不好
// TTAdManagerHolder.getInstance(this).requestPermissionIfNecessary(this);
//加载开屏广告
loadSplashAd();
}
private void getExtraInfo() {
Intent intent = getIntent();
if (intent == null) {
return;
}
String codeId = intent.getStringExtra("adId");
fromType = getIntent().getStringExtra("fromType");
if (!TextUtils.isEmpty(codeId)) {
mCodeId = codeId;
LogUtils.i("mCodeId",mCodeId);
}
}
/**
* 加载开屏广告
*/
private void loadSplashAd() {
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int statusBarHeightPx = (int) UIUtils.getStatusBarHeight(this);
float splashWidthDp = UIUtils.getScreenWidthDp(this);
int splashWidthPx = UIUtils.getScreenWidthInPx(this);
int screenHeightPx = UIUtils.getScreenHeight(this) + statusBarHeightPx;
float screenHeightDp = UIUtils.px2dip(this, screenHeightPx);
float splashHeightDp;
int splashHeightPx;
splashHeightDp = screenHeightDp;
splashHeightPx = screenHeightPx;
AdSlot adSlot = new AdSlot.Builder()
.setCodeId(mCodeId)
//模板广告需要设置期望个性化模板广告的大小,单位dp,代码位是否属于个性化模板广告,请在穿山甲平台查看
//view宽高等于图片的宽高
.setExpressViewAcceptedSize(splashWidthDp, splashHeightDp) // 单位是dp
.setImageAcceptedSize(splashWidthPx, splashHeightPx) // 单位是px
.build();
//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;
mSplashAd.showSplashView(mSplashContainer);
}
@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);
}
//初始化开屏点睛相关数据
//initSplashClickEyeData(mSplashAd, ad.getSplashView());
}
@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);
}
public static class SplashDownloadListener implements TTAppDownloadListener{
private boolean hasShow = false;
@Override
public void onIdle() {
}
@Override
public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
if (!hasShow) {
Log.d(TAG, "下载中...");
hasShow = true;
}
}
@Override
public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
Log.d(TAG, "下载暂停...");
}
@Override
public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
Log.d(TAG, "下载失败...");
}
@Override
public void onDownloadFinished(long totalBytes, String fileName, String appName) {
Log.d(TAG, "下载完成...");
}
@Override
public void onInstalled(String fileName, String appName) {
Log.d(TAG, "安装完成...");
}
}
public class SplashAdListener implements CSJSplashAd.SplashAdListener {
public WeakReference<Activity> mContextRef;
public SplashAdListener(Activity activity) {
mContextRef = new WeakReference<>(activity);
}
private void showToast(Context context, String msg) {
if (context == null || TextUtils.isEmpty(msg)) {
return;
}
ToastUtils.show(msg);
}
private void goToMainActivity() {
if (fromType.equals(START_UP_TYPE)){
if (!SPUtils.getIsLogin()) {
IntentUtils.startGuideActivity(mContextRef.get());
} else {
IntentUtils.startStartToMainActivity(mContextRef.get());
}
}
mContextRef.get().finish();
}
@Override
public void onSplashAdShow(CSJSplashAd ad) {
Log.d(TAG, "onAdShow");
//showToast(mContextRef.get(),"开屏广告展示");
}
@Override
public void onSplashAdClick(CSJSplashAd ad) {
Log.d(TAG, "onAdClicked");
//showToast(mContextRef.get(),"开屏广告点击");
EventBusUtils.post(new AdLookOverEvent(fromType,"1"));
}
@Override
public void onSplashAdClose(CSJSplashAd ad, int closeType) {
if (closeType == CSJSplashCloseType.CLICK_SKIP) {
// showToast(mContextRef.get(),"开屏广告点击跳过 ");
EventBusUtils.post(new AdLookOverEvent(fromType,"0"));
} else if (closeType == CSJSplashCloseType.COUNT_DOWN_OVER) {
// showToast(mContextRef.get(),"开屏广告点击倒计时结束");
EventBusUtils.post(new AdLookOverEvent(fromType,"1"));
} else if (closeType == CSJSplashCloseType.CLICK_JUMP) {
// showToast(mContextRef.get(),"点击跳转");
EventBusUtils.post(new AdLookOverEvent(fromType,"1"));
}
goToMainActivity();
}
}
private void goToMainActivity() {
if (fromType.equals(START_UP_TYPE)){
if (!SPUtils.getIsLogin()) {
IntentUtils.startGuideActivity(AdStartupActivity.this);
} else {
IntentUtils.startStartToMainActivity(AdStartupActivity.this);
}
}
finish();
}
@Override
public AdPresenter createPresenter() {
return new AdPresenter();
}
@Override
public AdIIView createView() {
return this;
}
}
有需要完整源码的私信我,我每天都看私信的