Android 接入穿山甲SDK之开屏广告

2023-11-19

大家可以先参考我的上一篇博客介绍了如何集成SDK以及一些工具类传送门

首先创建一个脚本写入如下内容

package com.unity3d.player.chuanshanjia;

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;

import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAppDownloadListener;
import com.bytedance.sdk.openadsdk.TTSplashAd;
import com.unity3d.player.R;
import com.unity3d.player.UnityPlayerActivity;
import com.unity3d.player.tools.ChuanShanJiaUtil;
import com.unity3d.player.tools.TToast;

public class CsjSplashActivity extends Activity {
    private static final String TAG = "SplashActivity";
    private TTAdNative mTTAdNative;
    private FrameLayout mSplashContainer;
    //是否强制跳转到主页面
    private boolean mForceGoMain;

    //开屏广告加载超时时间,建议大于3000,这里为了冷启动第一次加载到广告并且展示,示例设置了3000ms
    private static final int AD_TIME_OUT = 4000;
    private String mCodeId = "开屏广告位ID";
    private boolean mIsExpress = false; //是否请求模板广告
    private boolean mIsHalfSize = false;
    private static CsjSplashActivity _Instance;
    public static  CsjSplashActivity Inst(){
        return _Instance;
    }
    @SuppressWarnings("RedundantCast")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _Instance = this;
        setContentView(R.layout.activity_splash);
        mSplashContainer = (FrameLayout) findViewById(R.id.splash_container);
        //step2:创建TTAdNative对象
        mTTAdNative = TTAdManagerHolder.get().createAdNative(this);
        hideBottomUIMenu();  //隐藏虚拟按键,并且全屏
        getExtraInfo();
        TTAdManagerHolder.Inst().init(this,"应用ID","应用昵称");
    }

    private void getExtraInfo() {
        Intent intent = getIntent();
        if(intent == null) {
            return;
        }
        String codeId = intent.getStringExtra("splash_rit");
        if (!TextUtils.isEmpty(codeId)){
            mCodeId = codeId;
        }
        mIsExpress = intent.getBooleanExtra("is_express", false);
        mIsHalfSize = intent.getBooleanExtra("is_half_size", false);
    }

    @Override
    protected void onResume() {
        //判断是否该跳转到主页面
        if (mForceGoMain) {
            goToMainActivity();
        }
        super.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mForceGoMain = true;
    }
    /**
     * 加载开屏广告
     */
    public void loadSplashAd(){
        AdSlot adSlot=null;
        float splashWidthDp = ChuanShanJiaUtil.getScreenWidthDp(this);
        int splashWidthPx = ChuanShanJiaUtil.getScreenWidthInPx(this);
        int screenHeightPx = ChuanShanJiaUtil.getScreenHeight(this);
        float screenHeightDp = ChuanShanJiaUtil.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;
        }
        if (mIsExpress) {
            //个性化模板广告需要传入期望广告view的宽、高,单位dp,请传入实际需要的大小,
            //比如:广告下方拼接logo、适配刘海屏等,需要考虑实际广告大小
//            float expressViewWidth = ChuanShanJiaUtil.getScreenWidthDp(this);
//            float expressViewHeight = ChuanShanJiaUtil.getHeight(this);
            adSlot = new AdSlot.Builder()
                    .setCodeId(mCodeId)
                    .setSupportDeepLink(true)
                    .setImageAcceptedSize(splashWidthPx, splashHeightPx)
                    //模板广告需要设置期望个性化模板广告的大小,单位dp,代码位是否属于个性化模板广告,请在穿山甲平台查看
                    .setExpressViewAcceptedSize(splashWidthDp, splashHeightDp)
                    .build();
        } else {
            adSlot = new AdSlot.Builder()
                    .setCodeId(mCodeId)
                    .setSupportDeepLink(true)
                    .setImageAcceptedSize(splashWidthPx, splashHeightPx)
                    .build();
        }
        //step4:请求广告,调用开屏广告异步请求接口,对请求回调的广告作渲染处理
        mTTAdNative.loadSplashAd(adSlot, new TTAdNative.SplashAdListener() {
            @Override
            public void onError(int code, String message) {
                Log.d(TAG,"loadSplashAd OnError"+ message+" code:"+code);
                showToast(message);
                goToMainActivity();
            }

            @Override
            public void onTimeout() {
                Log.d(TAG,"loadSplashAd onTimeout");
                showToast("开屏广告加载超时");
                goToMainActivity();
            }

            @Override
            public void onSplashAdLoad(com.bytedance.sdk.openadsdk.TTSplashAd ad) {
                Log.d(TAG,"loadSplashAd success");
                Log.d(TAG, "开屏广告请求成功");
                if (ad == null) {
                    return;
                }
                //获取SplashView
                View view = ad.getSplashView();
                if (view != null && mSplashContainer != null && !CsjSplashActivity.this.isFinishing()) {
                    mSplashContainer.removeAllViews();
                    //把SplashView 添加到ViewGroup中,注意开屏广告view:width >=70%屏幕宽;height >=50%屏幕高
                    mSplashContainer.addView(view);
                    //设置不开启开屏广告倒计时功能以及不显示跳过按钮,如果这么设置,您需要自定义倒计时逻辑
                    //ad.setNotAllowSdkCountdown();
                }else {
                    goToMainActivity();
                }
                //设置SplashView的交互监听器
                ad.setSplashInteractionListener(new TTSplashAd.AdInteractionListener() {
                    @Override
                    public void onAdClicked(View view, int type) {
                        Log.d(TAG, "onAdClicked");
                        showToast("开屏广告点击");
                    }

                    @Override
                    public void onAdShow(View view, int type) {
                        Log.d(TAG, "onAdShow");
                        showToast("开屏广告展示");
                    }

                    @Override
                    public void onAdSkip() {
                        Log.d(TAG, "onAdSkip");
                        showToast("开屏广告跳过");
                        goToMainActivity();
                    }

                    @Override
                    public void onAdTimeOver() {
                        Log.d(TAG, "onAdTimeOver");
                        showToast("开屏广告倒计时结束");
                        goToMainActivity();
                    }
                });
                if(ad.getInteractionType() == TTAdConstant.INTERACTION_TYPE_DOWNLOAD) {
                    ad.setDownloadListener(new TTAppDownloadListener() {
                        boolean hasShow = false;

                        @Override
                        public void onIdle() {
                        }

                        @Override
                        public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
                            if (!hasShow) {
                                showToast("下载中...");
                                hasShow = true;
                            }
                        }

                        @Override
                        public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
                            showToast("下载暂停...");

                        }

                        @Override
                        public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
                            showToast("下载失败...");

                        }

                        @Override
                        public void onDownloadFinished(long totalBytes, String fileName, String appName) {
                            showToast("下载完成...");

                        }

                        @Override
                        public void onInstalled(String fileName, String appName) {
                            showToast("安装完成...");

                        }
                    });
                }
            }
        },AD_TIME_OUT);
    }

    /**
     * 跳转到主页面
     */
    private void goToMainActivity(){
        Intent intent=new Intent(CsjSplashActivity.this, UnityPlayerActivity.class);
        startActivity(intent);
        mSplashContainer.removeAllViews();  //移除所有视图
        this.finish();
    }

    private void showToast(String msg) {
        TToast.show(this, msg);
    }

    /**
     * 隐藏虚拟按键,并且全屏
     */
    protected void hideBottomUIMenu() {
        //隐藏虚拟按键,并且全屏
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = this.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
        }
    }
}

脚本创建完毕之后在AndroidMainfest文件中写入如下代码

<activity
        android:name="com.unity3d.player.chuanshanjia.CsjSplashActivity"
        android:configChanges="keyboard|orientation|screenSize"
        android:screenOrientation="sensorLandscape"
        android:theme="@style/Theme.Splash">
    <!--        android:theme="@android:style/Theme.Black">-->
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <!--表示在点击app图标的时候启动此Activity-->
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

Theme是在项目里面的res/values目录下创建了一个名为themes.xml具体内容如下

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="Theme.Splash" parent="Theme.Light">
        <item name="android:statusBarColor" tools:ignore="NewApi">#FF000000</item>
    </style>
    <style name="Theme.Light" parent="Theme.AppCompat.Light">
<!--        <item name="android:windowBackground">@color/default_window_bg</item>-->
        <item name="android:windowTranslucentNavigation" tools:ignore="NewApi">true</item>
        <!--解决部分手机隐藏状态栏顶部出现小黑条的问题-->
        <item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi">shortEdges</item>
        <item name="android:windowFullscreen">true</item>
    </style>
</resources>

下一篇 插屏广告 传送门

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 接入穿山甲SDK之开屏广告 的相关文章

随机推荐

  • mybatisPlus如何进行联接

    我想左连接某表 plus有没有提供api 类型leftJoin方法 是的 MyBatis Plus 提供了 API 来支持左连接查询 可以使用 leftJoin 方法进行左连接操作 以下是一个示例代码 import com baomidou
  • 调试osgEarth(33)分页瓦片卸载器子节点的作用-(3)渲染遍历的帧号和时间设置-_terrain使用TerrainCuller

    继续调试 这个是一堆NULL 省事了 然而 真的有这么简单么 想想地球加载起来时 视点变化时
  • 关于命令或语法中的方括号,尖括号等符号的区别

    关于方括号和尖括号的区别 命令说明或者语法说明中包含一些方括号 lt gt 等符号 方括号 表示可选参数 尖括号 表示必填参数 1 基本符号命令 内的内容意思是 可写可不写 那就必须要在 内给出的选择里选一个 lt gt 表示必选 注 不能
  • PKI体系及密码算法

    HTTPS 的诞生 可先参考网络协议 HTTPS协议等文章 明文传输 对称加密 加密 和 解密 使用 相同的 密钥 如果密钥可以安全的传输 那么消息也应该可以安全的传输 非对称加密 上述非对称加密与对称加密效果基本一样 如果公钥可以安全的传
  • squid使用NCSA验证

    如果要在squid中加入用户名和密码的验证 使用NCSA是最方便的 生成用户名 密码文件 用命令 htpasswd 来生成 使用非常简单 生成一个叫passwdfile的密码文件 包含username和password账户 htpasswd
  • 【电子电路】RS485收发器两种典型电路

    1 基本RS 485 电路 图1为一个经常被应用到的SP485R芯片的示范电路 可以被直接嵌入实际的RS 485应用电路中 微处理器的标准串行口通过RXD 直接连接SP485R 芯片的 RO 引脚 通过TXD直接连接SP485R 芯片的 D
  • Markdown基础语法介绍

    何为Markdown Markdown是一种轻量级标记语言 它允许用户以纯文本格式编写文档 然后转换成有效的XHTML或HTML文档 Markdown具备轻量化 跨平台 易读易写等特性 且支持文本 图片 图表等多种展示样式 Markdown
  • 使用Mac的十大最好用神器

    资深 Mac 用户 提升效率的 10 大神器 谢志鹏 大家好 我是曹将的徒弟 Pem 最近刚结束悉尼大学研究生的学习 是一枚正在求职的交互设计师 我是从 2015 年开始使用 Mac 的 如果用一句话来形容 Mac 的使用感受 那就是 令人
  • 下载Freescale CodeWarrior 11.0解决Freescale CodeWarrior 代码限制(不需要license)

    一些NXP的项目需要软件Freescale CodeWarrior的最新版本10 7 但是新安装了软件之后 10 7版本的license只能使用一个月 一个月到期后 就会有代码大小的限制 这个时候 需要花钱购买license 费用几千块钱
  • android.accessibilityservice包介绍

    android accessibilityservice 英文原文 http developer android com reference android accessibilityservice package summary html
  • Ant Design Pro 修改主题设置

    Ant Design Pro 修改主题设置 主题是在项目根目录下的config defaultSettings js文件下内所定义的其中导出的Settings对象中即为默认的主题等配置 如下图 const Settings navTheme
  • Vue2项目使用高德地图

    目录 一 账号准备 1 注册账号 2 获取key 二 快速上手 1 安装 2 创建地图 3 点标记 4 海量点标记 5 简易行政区图 6 GeoJSON 三 绑定事件 总结 一 账号准备 1 注册账号 首先 注册开发者账号 成为高德开放平台
  • 高德地图加渐变色3D线段

    想用高德地图实现渐变色的边界效果 查看了很多资料 测试了很多方法 终于实现啦 记录一下 1 按照高德官方示例创建地图 var map new AMap Map container pitch 75 地图俯仰角度 有效范围 0 度 83 度
  • python基础练习--《人力资源管理员工管理》

    python新手入门练习 运用python的基础数据结构编写 人力资源管理员工管理 初学python 入门练习 留些记录 方便以后查看 如有错误 请诸位大神指点 谢谢 需求分析 要求使用python的最基础的数据结构 字典 元组 列表 字符
  • [系统安全] 四十六.恶意软件分析 (2)静态分析Capa经典工具批量提取静态特征和ATT&CK技战术

    终于忙完初稿 开心地写一篇博客 您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意
  • JS 实现一键复制(复制DIV)

    话不多说 直接上代码 JS部分 function copyDivContent divId 获取标签内容 const div document getElementById divId 创建文档区域 const range document
  • 计算机硬件系统结构主要分为什么五大组成,硬件系统的五大组成部分

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 以计算机为例 硬件系统的五大组成部分别为 储存器 控制器 运算器 输入设备 输出设备 计算机硬件 Computer hardware 是指计算机系统中由电子 机械和光电元件
  • 面试题流散汇总

    1 n位数全排列 大字符串相加 SQL HTTPS 根据简历来问 2 MapReduce和Spark的主要区别在于 MapReduce使用持久存储 而Spark使用弹性分布式数据集 RDDS Spark之所以如此快速 原因在于它在内存中处理
  • python爬取链家二手房信息并存储到数据库

    爬取链家的二手房信息 存储到数据库方便以后查看 文章目录 页面分析 引入库 方法编写 主函数编写 运行结果 页面分析 分析页面后发现是前后端未分离的状态 所以需要使用xpath分析界面元素 在li中存放着对应的div 有相关的信息 分析请求
  • Android 接入穿山甲SDK之开屏广告

    大家可以先参考我的上一篇博客介绍了如何集成SDK以及一些工具类传送门 首先创建一个脚本写入如下内容 package com unity3d player chuanshanjia import android app Activity im