建筑工程网站定制,帮建网站,公众平台微信公众号登陆,网站建设实验周志与总结本文旨在记录初步接入过程遇到的一点点小问题#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
… 本文旨在记录初步接入过程遇到的一点点小问题更详细的文档还是要参考官方文档。
一、项目版本
GradlePlugin8.0.2
Gradle8.0
Kotlin1.7.20
compileSdk34
compose-bom:2022.10.00
AS2022.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:nameandroid.permission.INTERNET /
!--必要权限解决安全风险漏洞发送和注册广播事件需要调用带有传递权限的接口--
permissionandroid:name${applicationId}.openadsdk.permission.TT_PANGOLINandroid:protectionLevelsignature /
uses-permission android:name${applicationId}.openadsdk.permission.TT_PANGOLIN /!--可选权限--
uses-permission android:nameandroid.permission.READ_PHONE_STATE /
uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /
uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /
uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE /
uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION /
uses-permission android:nameandroid.permission.REQUEST_INSTALL_PACKAGES/
uses-permission android:nameandroid.permission.GET_TASKS/!--可选穿山甲提供“获取地理位置权限”和“不给予地理位置权限开发者传入地理位置参数”两种方式上报用户位置两种方式均可不选添加位置权限或参数将帮助投放定位广告--
!--请注意无论通过何种方式提供给穿山甲用户地理位置均需向用户声明地理位置权限将应用于穿山甲广告投放穿山甲不强制获取地理位置信息--
uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION /!--demo场景用到的权限不是必须的--
uses-permission android:nameandroid.permission.RECEIVE_USER_PRESENT /
uses-permission android:nameandroid.permission.SYSTEM_ALERT_WINDOW /
uses-permission android:nameandroid.permission.EXPAND_STATUS_BAR /!-- 穿山甲3400版本新增建议添加“query_all_package”权限穿山甲将通过此权限在Android R系统上判定广告对应的应用是否在用户的app上安装避免投放错误的广告以此提高用户的广告体验。若添加此权限需要在您的用户隐私文档中声明 --
uses-permission android:nameandroid.permission.QUERY_ALL_PACKAGES/
4.添加provider
providerandroid:namecom.bytedance.sdk.openadsdk.TTFileProviderandroid:authorities${applicationId}.TTFileProviderandroid:exportedfalseandroid:grantUriPermissionstruemeta-dataandroid:nameandroid.support.FILE_PROVIDER_PATHSandroid:resourcexml/file_paths /
/provider
providerandroid:namecom.bytedance.sdk.openadsdk.multipro.TTMultiProviderandroid:authoritiescom.lee.tts.TTMultiProviderandroid:exportedfalse /
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}/*** 当isCanUseLocationfalse时可传入地理位置信息穿山甲sdk使用您传入的地理位置信息** return 地理位置参数*/// override fun getTTLocation(): TTLocation? {// return null// }/*** 是否允许SDK主动使用手机硬件参数如imei** return true可以使用false禁止使用。默认为true*/override fun isCanUsePhoneState(): Boolean {return false}/*** 当isCanUsePhoneStatefalse时可传入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?id120* 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: Didnt find class android.support.v4.content.FileProvider 我们可以看到报错了那改成 androidx.core.content.FileProvider再运行呢还是一样的错那就不是这个问题如果有过support项目升级的经验我们就知道在升级AndroidX的时候AS在gradle.properties添加了如下配置
android.useAndroidXtrue
# Automatically convert third-party libraries to use AndroidX
android.enableJetifiertrue useAndroidX不用说关键是enableJetifiertrue看注释说的是自动将第三方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: Didnt find class androidx.appcompat.view.ContextThemeWrapper 这两个问题其实跟FileProvider是相连的第三方SDK在enableJetifiertrue时转换成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代码