AndroidX项目接入穿山甲广告填坑

        本文旨在记录初步接入过程遇到的一点点小问题,更详细的文档还是要参考官方文档。

一、项目版本

GradlePlugin:8.0.2

Gradle:8.0

Kotlin:1.7.20

compileSdk:34

compose-bom:2022.10.00

AS:2022.2.1

穿山甲:5.6.0.7

二、接入穿山甲SDK

1.添加穿山甲SDK下载仓库
maven {url 'https://artifact.bytedance.com/repository/pangle'
}
 2.添加穿山甲SDK
implementation 'com.pangle.cn:ads-sdk-pro:5.6.0.7'
3.添加必要权限

        在当下隐私政策要求越来越严,如果不是必要场景尽量不要添加可选权限,且在初始化的时候配置SDK不可主动获取。

<!--必要权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--必要权限,解决安全风险漏洞,发送和注册广播事件需要调用带有传递权限的接口-->
<permissionandroid:name="${applicationId}.openadsdk.permission.TT_PANGOLIN"android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN" /><!--可选权限-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_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"/><!--可选,穿山甲提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,添加位置权限或参数将帮助投放定位广告-->
<!--请注意:无论通过何种方式提供给穿山甲用户地理位置,均需向用户声明地理位置权限将应用于穿山甲广告投放,穿山甲不强制获取地理位置信息-->
<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" /><!-- 穿山甲3400版本新增:建议添加“query_all_package”权限,穿山甲将通过此权限在Android R系统上判定广告对应的应用是否在用户的app上安装,避免投放错误的广告,以此提高用户的广告体验。若添加此权限,需要在您的用户隐私文档中声明! -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
4.添加provider
<providerandroid:name="com.bytedance.sdk.openadsdk.TTFileProvider"android:authorities="${applicationId}.TTFileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>
<providerandroid:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"android:authorities="com.lee.tts.TTMultiProvider"android:exported="false" />
5.添加so库构架

        官网表示其他构架需要联系其技术支持。

ndk {abiFilters  'armeabi-v7a', 'arm64-v8a'
}
6.初始化SDK
//强烈建议在应用对应的Application#onCreate()方法中调用,避免出现content为null的异常
TTAdSdk.init(mContext, TTAdConfig.Builder().appId("5438863")//xxxxxxx为穿山甲媒体平台注册的应用ID.useTextureView(true) //默认使用SurfaceView播放视频广告,当有SurfaceView冲突的场景,可以使用TextureView.appName("文本转语音助手").titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)//落地页主题.allowShowNotify(true) //是否允许sdk展示通知栏提示,若设置为false则会导致通知栏不显示下载进度,存在违规风险,请勿随意更改.debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用.directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI) //允许直接下载的网络状态集合,没有设置的网络下点击下载apk会有二次确认弹窗,弹窗中会披露应用信息.supportMultiProcess(false) //是否支持多进程,true支持.customController(object : TTCustomController() { // 隐私信息控制开关/*** 是否允许SDK主动使用地理位置信息** @return true可以获取,false禁止获取。默认为true*/override fun isCanUseLocation(): Boolean {return false}/*** 当isCanUseLocation=false时,可传入地理位置信息,穿山甲sdk使用您传入的地理位置信息** @return 地理位置参数*/// override fun getTTLocation(): TTLocation? {//     return null// }/*** 是否允许SDK主动使用手机硬件参数,如:imei** @return true可以使用,false禁止使用。默认为true*/override fun isCanUsePhoneState(): Boolean {return false}/*** 当isCanUsePhoneState=false时,可传入imei信息,穿山甲sdk使用您传入的imei信息** @return imei信息*/// override fun getDevImei(): String? {//     return null// }/*** 是否允许SDK主动使用ACCESS_WIFI_STATE权限** @return true可以使用,false禁止使用。默认为true*/// override fun isCanUseWifiState(): Boolean {//     return true// }/*** 是否允许SDK主动使用WRITE_EXTERNAL_STORAGE权限** @return true可以使用,false禁止使用。默认为true*/override fun isCanUseWriteExternal(): Boolean {return false}/*** 开发者可以传入oaid* 信通院OAID的相关采集——如何获取OAID:* 1. 移动安全联盟官网http://www.msa-alliance.cn/* 2. 信通院统一SDK下载http://msa-alliance.cn/col.jsp?id=120* @return oaid*/// override fun getDevOaid(): String? {//     return null// }/*** 是否允许SDK主动获取设备上应用安装列表的采集权限** @return true可以使用,false禁止使用。默认为true*/override fun alist(): Boolean {return false}/*** 是否允许SDK主动获取ANDROID_ID** 4600新增** @return 默认true 允许 , false 不允许*/// override fun isCanUseAndroidId(): Boolean {//     return true// }/*** 是否允许SDK在申明和授权了的情况下使用录音权限** @return true 允许 false 不允许*/// override fun isCanUsePermissionRecordAudio(): Boolean {//     return true// }}).build())

7.启动SDK

        穿山甲需要启动才能正常使用。 

TTAdSdk.start(object : TTAdSdk.Callback {override fun success() {Log.d(TAG, "TTAdSdk.start success.")}override fun fail(code: Int, msg: String?) {Log.d(TAG, "TTAdSdk.start fail. code=$code, msg=$msg")}
})

三、填坑

1.FileProvider

        从第二节第4点可以看到provider的meta-data是android.support.FILE_PROVIDER_PATHS,正常来说我们升级到AndroidX用的应该是androidx.core.content.FileProvider,我们先保持跟穿山甲文档一致然后运行。

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider"

        我们可以看到报错了,那改成 androidx.core.content.FileProvider再运行呢?还是一样的错,那就不是这个问题,如果有过support项目升级的经验,我们就知道在升级AndroidX的时候AS在gradle.properties添加了如下配置:

android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

        useAndroidX不用说,关键是enableJetifier=true,看注释说的是自动将第三方SDK转换成使用AndroidX。看到这里就知道了,首先TTFileProvider用的是android.support的FileProvider,只能通过设置enableJetifier去转换。那么meta-data到底能不能改呢?带着这个疑问,我们继续运行:

java.lang.RuntimeException: Unable to get provider com.bytedance.sdk.openadsdk.TTFileProvider: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data

         看到报错就知道还是只能照着文档写,不能改!

2.ClassNotFoundException

        解决完FileProvider问题后继续运行,这时候又有报错了。

Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/fragment/app/FragmentActivity;

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.appcompat.view.ContextThemeWrapper"

        这两个问题其实跟FileProvider是相连的,第三方SDK在enableJetifier=true时转换成AndroidX了,但是新建的项目并没有引用AndroidX的fragment,所以就报错了,加上就可以了。其实如果不是新建项目改成了compose应该是没有这个问题的,我记得compose之前创建项目会有相关依赖。

implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.fragment:fragment-ktx:1.5.5'

四、开屏广告

        前面配置好了到这一步其实就简单了,只是有始有终再多写两句。

        首先,我们需要在穿山甲平台创建一个应用,具体截图就不插入了,没什么难点。

        然后,从文档了解到,如果需要播放广告,我们需要为应用新建广告位,比如开屏广告位,新建好之后会有个广告代码位字符串,这是我们请求相应广告位广告的关键。

        最后,上代码。

mTTAdNative =  TTAdSdk.getAdManager().createAdNative(this)
val adSlot = AdSlot.Builder().setCodeId("888565580")//不区分渲染方式,要求开发者同时设置setImageAcceptedSize(单位:px)和setExpressViewAcceptedSize(单位:dp )接口,不同时设置可能会导致展示异常。.setImageAcceptedSize(resources.displayMetrics.widthPixels, resources.displayMetrics.heightPixels).setExpressViewAcceptedSize(resources.displayMetrics.widthPixels / resources.displayMetrics.density + 0.5f, resources.displayMetrics.heightPixels / resources.displayMetrics.density + 0.5f).setAdLoadType(TTAdLoadType.PRELOAD)//推荐使用,用于标注此次的广告请求用途为预加载(当做缓存)还是实时加载,方便后续为开发者优化相关策略.build()
mTTAdNative.loadSplashAd(adSlot, object : TTAdNative.CSJSplashAdListener {//开屏素材加载成功override fun onSplashLoadSuccess() {Log.d(TAG, "onSplashLoadSuccess")}//加载开屏素材失败override fun onSplashLoadFail(p0: CSJAdError?) {Log.d(TAG, "onSplashLoadFail=${p0?.msg}")//开发者处理跳转到APP主页面逻辑gotoMain()}//开屏渲染成功,可以展示开屏override fun onSplashRenderSuccess(ad: CSJSplashAd?) {Log.d(TAG, "onSplashRenderSuccess")ad?.let {mSplashView = it.splashViewreturn}//开发者处理跳转到APP主页面逻辑gotoMain()}override fun onSplashRenderFail(ad: CSJSplashAd?, err: CSJAdError?) {Log.d(TAG, "onSplashRenderFail=${err?.msg}")//开发者处理跳转到APP主页面逻辑gotoMain()}
}, 3500)

        至此穿山甲SDK的接入就已经完成了,后续的业务请根据自身需求进行开发。

五、Demo代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java反射调用jar包

反射作为托管语言的特性&#xff0c;很多框架都依赖反射来实现容器和面向接口编程&#xff0c;对架构程序很重要&#xff0c;首先试验Java的反射部分。 首先创建一个ZLZJar的工程&#xff0c;让他打包成jar包&#xff0c;代码如下 public class Test {//加两个整数public int…

ELK 日志分析系统介绍与部署

目录 一、ELK 简介: 1.开源工具介绍&#xff1a; 2.其它组件&#xff1a; 2.1 Filebeat&#xff1a; 2.2 Fluentd&#xff1a; 2.3 缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09;&#xff1a; 3. filebeat 结合 logstash 带来好处&#xff1a; 二、为什么要…

网络监控与故障排除:netstat命令的使用指南

文章目录 概述什么是 netstat 命令&#xff1f;netstat 命令的作用和功能netstat 命令的常见用途 安装和基本用法安装 netstat 命令netstat 命令的基本语法查看活动网络连接 查看网络接口信息查看所有网络接口信息查看指定网络接口信息网络接口状态说明 网络连接状态显示所有连…

[0xGameCTF 2023] web题解

文章目录 [Week 1]signinbaby_phphello_httprepo_leakping [Week 2]ez_sqli方法一&#xff08;十六进制绕过&#xff09;方法二&#xff08;字符串拼接&#xff09; ez_upload [Week 1] signin 打开题目&#xff0c;查看下js代码 在main.js里找到flag baby_php <?php /…

云安全——云计算基础

0x00 前言 学习云安全&#xff0c;那么必然要对云计算相关的内容进行学习和了解&#xff0c;所以云安全会分为两个部分来进行&#xff0c;首先是云计算先关的内容。 0x01 云计算 广泛传播 云计算最早大范围传播是2006年&#xff0c;8月&#xff0c;在圣何塞【1】举办的SES&a…

【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;vue要做权限管理该怎么做…

微信小程序异常:navigateTo:fail can not navigateTo a tabbar page

场景还原 微信小程序利用路径wx.navigateTo跳转界面时发送异常 跳转代码 showDetail(e){// 获取图片绑定的ID编号let id e.currentTarget.dataset.id;// 指定编号查询 携带参数到详情界面 wx.navigateTo({url: /pages/details/details?id id,})}异常代码 WAServiceMain…

【Java 进阶篇】JavaScript电灯开关案例:从原理到实现

JavaScript是一门强大的编程语言&#xff0c;它可以用来创建各种交互式网页应用。在这篇博客中&#xff0c;我们将通过一个简单的电灯开关案例来深入了解JavaScript的基础概念&#xff0c;包括HTML、CSS和JavaScript的结合使用。我们将从头开始构建这个案例&#xff0c;逐步引入…

20231008-20231013 读书笔记

计算机硬件 基本硬件系统&#xff1a;运算器、控制器、存储器、输入设备和输出设备中央处理单元&#xff08;CPU&#xff09;:运算器、控制器、寄存器组和内部总线等部件组成 功能&#xff1a;程序控制、操作控制、时间控制、数据处理运算器&#xff1a;ALU、AC、DR、PSW控制器…

Go 匿名函数与闭包

Go 匿名函数与闭包 匿名函数和闭包是一些编程语言中的重要概念&#xff0c;它们在Go语言中也有重要的应用。让我们来详细介绍这两个概念&#xff0c;并提供示例代码来帮助理解。 文章目录 Go 匿名函数与闭包一、匿名函数&#xff08;Anonymous Function&#xff09;二、闭包函…

论文阅读--深度学习基础文献

本文属于资料整理 AlphaGo Zero 论文信息&#xff1a;Silver D, Schrittwieser J, Simonyan K, et al. Mastering the game of go without human knowledge[J]. nature, 2017, 550(7676): 354-359. 参考文章&#xff1a; 深入浅析AlphaGo Zero与深度强化学习 AlphaGo Zero论文…

TensorFlow入门(二十四、初始化学习参数)

参数的初始化关系到网络能否训练出好的结果或者是以多快的速度收敛,对训练结果有着重要的影响。 初始化学习参数需要注意的规则 不可以将网络中的所有参数初始化为0,也不能全部初始化为同一个值。如果参数全部初始化为0或者是同一个值,会使得所有神经元的输出都是相同的,进而造…

PYTHON进阶-面向对象编程

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

windows计划任务的配置文件

界面操作 创建计划 依次设置 命令行操作 SCHTASKS 命令简介 SCHTASKS 命令是由微软公司开发并内置于 Windows 系统中的一个命令行工具。该命令可用于设置、修改、查询和删除计划任务&#xff0c;或启动计划任务中所定义的程序或脚本。 SCHTASKS 命令的基本语法 SCHTASKS 命…

多输入多输出 | MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测

MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 C…

SpringBoot面试题1:什么是SpringBoot?为什么要用SpringBoot?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是SpringBoot? Spring Boot 是一个用于快速开发独立的、基于 Spring 框架的应用程序的开源框架。它简化了 Spring 应用的配置和部署过程,使…

基于秃鹰优化的BP神经网络(分类应用) - 附代码

基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.秃鹰优化BP神经网络3.1 BP神经网络参数设置3.2 秃鹰算法应用 4.测试结果&#xff1a;5.M…

【HuggingFace文档学习】Bert的token分类与句分类

BERT特性&#xff1a; BERT的嵌入是位置绝对&#xff08;position absolute&#xff09;的。BERT擅长于预测掩码token和NLU&#xff0c;但是不擅长下一文本生成。 1.BertForTokenClassification 一个用于token级分类的模型&#xff0c;可用于命名实体识别(NER)、部分语音标记…

智慧公厕高精尖技术揭秘,让卫生管理更智能、更舒适

随着科技的飞速发展&#xff0c;智慧公厕正逐渐走进人们的生活。借助物联网、互联网、云计算、大数据、人工智能、自动化控制等技术的应用&#xff0c;智慧公厕将卫生管理提升到一个全新的水平&#xff0c;为公众打造了清洁舒适的使用环境。本文以智慧公厕源头厂家广州中期科技…

【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;Vue项目中你是如何解决跨…