当前位置: 首页 > news >正文

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代码

相关文章:

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

本文旨在记录初步接入过程遇到的一点点小问题&#xff0c;更详细的文档还是要参考官方文档。 一、项目版本 GradlePlugin&#xff1a;8.0.2 Gradle&#xff1a;8.0 Kotlin&#xff1a;1.7.20 compileSdk&#xff1a;34 compose-bom:2022.10.00 AS&#xff1a;2022.2.1 …...

汽车电子 - matlab - 用法

汽车电子 - matlab - 用法 面向对象 面向对象 % Man.m classdef Man < handle%UNTITLED2 此处显示有关此类的摘要% 此处显示详细说明properties(Accessprivate) %私有变量scoreendpropertiesageheightendmethodsfunction obj Man(inputArg1,inputArg2)%UNTITLED2 构造此…...

freefilesync文件同步软件

下载 下载链接 https://freefilesync.org/download.php 往下拉&#xff0c;看到下载的链接 下载windows版本 下载地址&#xff1a; https://freefilesync.org/download/FreeFileSync_13.0_Windows_Setup.exe 直接复制到浏览器中访问就能下载 安装 双击安装包&#xff0c;一路默…...

【2023】M1/M2 Mac 导入Flac音频到Pr的终极解决方案

介绍 原作者链接&#xff1a;https://github.com/fnordware/AdobeOgg 很早之前就发现了这个插件&#xff0c;超级好用&#xff0c;在windows上完全没有问题&#xff0c;可惜移植到mac就不行了&#xff08;然后我给作者发了一个Issue&#xff0c;后来就有大佬把m1的编译出来了&…...

C# 图解教程 第5版 —— 第6章 方法

文章目录 6.1 方法的结构6.2 方法体内部的代码执行6.3 局部变量6.3.1 类型推断和 var 关键字6.3.2 嵌套块中的局部变量 6.4 局部常量6.5 控制流6.6 方法调用&#xff08;*&#xff09;6.7 返回值&#xff08;*&#xff09;6.8 返回语句和 void 方法6.9 局部函数6.10 参数&#…...

283 移动零

解题思路&#xff1a; \qquad 适用双指针&#xff0c;l&#xff1a;最左边‘0’元素坐标&#xff1b;r&#xff1a;l右边第一个非零元素坐标。 \qquad 最初的思路&#xff1a;将l和r初始化为0&#xff0c;遍历数组nums若任意一个指针到达数组末尾时停止。若当前nums[l] 0则移…...

maven 编译.../maven-metadata.xml 报错

文章目录 问题解决 问题 突然编译报错: 解决 打开maven的里离线工作模式,感觉就是下载包到本地. 一个是在maven设置里面 或者直接在maven编译的窗口:...

【Rust笔记】Rust与Java交互-JNI模块编写-实践总结

近期工作中有Rust和Java互相调用需求&#xff0c;这篇文章主要介绍如何用Rust通过JNI和Java进行交互&#xff0c;还有记录一下开发过程中遇到的一些坑。 JNI简单来说是一套Java与其他语言互相调用的标准&#xff0c;主要是C语言&#xff0c;官方也提供了基于C的C接口。 既然是C…...

uniapp:幸运大转盘demo

<template><view class"index"><image src"../../static/img/158.png" mode"" class"banner"></image><view class"title">绿色积分加倍卡拿到手软</view><almost-lottery :lottery…...

android 13.0 通过系统自定义服务控制屏幕亮屏和灭屏操作

1.前言 在13.0的产品开发中, 需要提供亮屏和灭屏的接口在8.0以后系统对于屏幕亮灭屏做了限制,直接调用亮屏和灭屏的方法就调不到了,所有就需要通过增加自定义服务的功能,来实现 通过系统服务的方法来调用系统关于控制屏幕亮屏灭屏的相关操作 2.通过系统自定义服务控制屏幕…...

【SQL】新建库表时,报错attempt to write a readonly database

目录 1.问题背景 2.问题原因 3.解决方式 4.结果 windows64位 Navicat sql vscode c 1.问题背景 需求是这样&#xff1a; 希望在调用初始化数据库方法时&#xff0c;查看是否有名为【POCT_PROCESS_CONFIG】的数据库表&#xff0c;如果没有就新建 我的数据库格式是这样 …...

C++ --STL

STL STL&#xff08;Standard Template Library,标准模板库&#xff09;STL从广义上分为&#xff1a; 容器&#xff08;container&#xff09;算法 (algorithm)迭代器 (iterator) 容器 和 算法之间通过迭代器进行无缝连接。STL几乎所有的代码都采用模板类或者模板函数 1、ST…...

一卷到底,大明哥带你横扫 Netty

上一个死磕 Java 专栏【死磕 NIO】(当然写的不是很好&#xff0c;争取今年将它重写一遍)是**【死磕 Netty】**的铺垫&#xff0c;对于我们 Java 程序员而言&#xff0c;我们在实际开发过程一般都不会直接使用 Java NIO 作为我们的网络编程框架&#xff0c;因为写出一套高质量的…...

Python Opencv实践 - 车辆统计(1)读取视频,移除背景,做预处理

示例中的图像的腐蚀、膨胀和闭运算等需要根据具体视频进行实验得到最佳效果。代码仅供参考。 import cv2 as cv import numpy as np#读取视频文件 video cv.VideoCapture("../../SampleVideos/Traffic.mp4") FPS 10 DELAY int(1000 / FPS) kernel cv.getStructu…...

ROS-6.参数的使用

参数的使用 参数服务结构命令行的使用方式运行小海龟命令介绍查看参数获取参数值设置参数保存参数到文件从文件导入参数 通过程序操作创建节点修改cmake编译运行 参数服务结构 ros中存在参数服务管理服务&#xff0c;管理这所有参数&#xff0c;所有节点剋订阅和发布这些节点 …...

机器视觉在自动驾驶汽车中的应用与挑战

机器视觉在自动驾驶汽车中扮演着至关重要的角色&#xff0c;它使车辆能够感知和理解周围环境&#xff0c;以便自主驾驶。以下是机器视觉在自动驾驶汽车中的应用以及相关挑战&#xff1a; 应用&#xff1a; 障碍物检测与避让&#xff1a; 机器视觉系统可以检测和识别路上的障碍…...

欠拟合、过拟合及优化:岭回归

问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢? 当算法在某个数据集当中出现这种情况,可能就出现了过拟合现象。 1、 什么是过拟合与欠拟合 欠拟合 过拟合 分析 第一种情况:因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅…...

Mybatis学习笔记注解/xml映射/动态SQL%%%Mybatis教程

介绍 Mybatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 的开发 MyBatis中文网 Mybatis 入门 快速入门 步骤 创建 SpringBoot 工程、数据库表 user、实体类 User引入 Mybatis 相关依赖&#xff0c;配置 Mybatis&#xff08;数据库连接信息&#xff09;编写 SQL 语…...

Git纯操作版 项目添加和提交、SSH keys添加、远程仓库控制、冲突解决、IDEA连接使用

Git 文章目录 Git项目简单克隆通用操作添加和提交回滚分支变基分支优选 远程项目推送认证抓取、拉取和冲突解决 IEDA类软件连接 最近学原理学的快头秃了&#xff0c;特此想出点不讲原理的纯操作版&#xff0c;不过还是放个图吧 项目简单克隆 git在本人日常中最重要的功能还是…...

使用OpenSSL生成自签证书

什么是OpenSSL OpenSSL是一个开源的软件库和工具套件&#xff0c;用于安全地处理网络数据传输中的加密、解密、安全套接层&#xff08;SSL&#xff09;以及传输层安全&#xff08;TLS&#xff09;协议等功能。它广泛应用于网站和互联网服务中&#xff0c;以确保数据传输的安全…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...