穿山甲广告sdk接入

本文讲解下穿山甲广告接入的具体细节(如有不仔细的麻烦各位指出,定当万分感激)

实现功能:视频播放器首页加载开屏广告

工具: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切换至上一个版本

相关推荐
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 笑话生成器实现
android·javascript·python·flutter·游戏
2501_944526423 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 21点游戏实现
android·javascript·flutter·游戏·harmonyos
Alex老夫子3 小时前
android room数据库增加字段注意事项
android·数据库
2501_915918413 小时前
iOS App 测试方法,Xcode、TestFlight与克魔(KeyMob)等工具组合使用
android·macos·ios·小程序·uni-app·iphone·xcode
冬奇Lab3 小时前
Android 15 显示子系统深度解析(一):显示框架总览与SurfaceFlinger核心机制
android·性能优化
千里马学框架3 小时前
跟着google官方文档学习车载音频Car audio configuration
学习·configuration·音视频·aaos·安卓framework开发·audio·车机
代码煮茶君4 小时前
MySQL 数据库死锁及核心机制全解析
android·数据库·mysql
Kratzdisteln4 小时前
【1902】0120-3 Dify变量引用只能引用一层
android·java·javascript
2501_915921434 小时前
iOS 描述文件制作过程,从 Bundle ID、证书、设备到描述文件生成后的验证
android·ios·小程序·https·uni-app·iphone·webview