From e714a1ef6371088fb5dcc83dca08acf39961adac Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Fri, 28 Nov 2025 12:12:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=EF=BC=8C=E6=B7=BB=E5=8A=A0admob=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E5=B0=81=E8=A3=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 8 ++ .../UpLoadLibrary_11_24_18_30-release.aar | Bin 0 -> 20915 bytes app/src/main/AndroidManifest.xml | 4 + .../com/all/pdfreader/pdf/reader/PRApp.kt | 15 +++- .../all/pdfreader/pdf/reader/ad/AdInstLoad.kt | 68 +++++++++++++++ .../pdfreader/pdf/reader/ad/AdInstShower.kt | 68 +++++++++++++++ .../all/pdfreader/pdf/reader/ad/AdsInsUtil.kt | 82 ++++++++++++++++++ .../pdf/reader/ad/InstAdCacheManager.kt | 39 +++++++++ .../pdfreader/pdf/reader/ad/LoadListener.kt | 8 ++ .../pdfreader/pdf/reader/ad/ShowListener.kt | 8 ++ .../pdf/reader/util/AnalyticsUtils.kt | 32 ++++++- app/src/main/res/xml/net.xml | 6 ++ settings.gradle.kts | 6 ++ 13 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 app/libs/UpLoadLibrary_11_24_18_30-release.aar create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstLoad.kt create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstShower.kt create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdsInsUtil.kt create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/InstAdCacheManager.kt create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/LoadListener.kt create mode 100644 app/src/main/java/com/all/pdfreader/pdf/reader/ad/ShowListener.kt create mode 100644 app/src/main/res/xml/net.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9efde7e..85dfe1d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -84,6 +84,7 @@ android { } dependencies { + implementation(files("libs/UpLoadLibrary_11_24_18_30-release.aar")) implementation(libs.androidx.fragment.ktx) implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) @@ -112,4 +113,11 @@ dependencies { implementation(platform("com.google.firebase:firebase-bom:34.6.0")) implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") + // google ads + implementation("com.google.android.gms:play-services-ads:24.7.0") + implementation ("com.google.android.gms:play-services-ads-identifier:18.0.1") + // okhttp + implementation ("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + } \ No newline at end of file diff --git a/app/libs/UpLoadLibrary_11_24_18_30-release.aar b/app/libs/UpLoadLibrary_11_24_18_30-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..01829d2ca59e201210a405e1a4438d3fb5b3ffdf GIT binary patch literal 20915 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 KOHco=+us1wl^~@6 literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 49d074d..c7d19bc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -35,10 +35,14 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" + android:networkSecurityConfig="@xml/net" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PDFReaderPro"> + diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/PRApp.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/PRApp.kt index 182ba34..36c7d0e 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/PRApp.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/PRApp.kt @@ -6,7 +6,10 @@ import androidx.annotation.StringRes import com.all.pdfreader.pdf.reader.room.repository.PdfRepository import com.all.pdfreader.pdf.reader.util.AnalyticsUtils import com.all.pdfreader.pdf.reader.util.FileChangeObserver +import com.google.android.gms.ads.MobileAds +import com.google.android.gms.ads.RequestConfiguration import com.tom_roush.pdfbox.android.PDFBoxResourceLoader +import com.up.uploadlibrary.UpLoadManager class PRApp : Application() { @@ -39,10 +42,20 @@ class PRApp : Application() { PdfRepository.initialize(this) // 初始化pdfbox PDFBoxResourceLoader.init(this) + // 上传 + UpLoadManager.init(context = this, tag = "PRApp_upload_task") { _, _ -> } + // 广告初始化 + MobileAds.initialize(this) + } + + private fun initMobileAds(){ + val testDeviceIds = listOf("TEST_DEVICE_ID") + val configuration = RequestConfiguration.Builder().setTestDeviceIds(testDeviceIds).build() + MobileAds.setRequestConfiguration(configuration) } // 在权限授权后调用 fun startFileChangeObserving() { - fileChangeObserver.startObserving() +// fileChangeObserver.startObserving() } } diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstLoad.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstLoad.kt new file mode 100644 index 0000000..e06bb73 --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstLoad.kt @@ -0,0 +1,68 @@ +package com.all.pdfreader.pdf.reader.ad + +import android.app.Activity +import android.util.Log +import com.all.pdfreader.pdf.reader.util.AnalyticsUtils +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.interstitial.InterstitialAd +import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback + +class AdInstLoad( + private val activity: Activity, + private val placement: AdsInsUtil.AdPlacement, + private val adLoadListener: LoadListener? +) { + + init { + loadAd() + } + + private fun loadAd() { + //多处调用load,也不会重复、不影响缓存广告、展示安全 + val cachedAd = InstAdCacheManager.instance.getAdCache(placement) + if (cachedAd != null) { + Log.d("ocean","广告存在缓存,跳过加载,返回成功") + //缓存广告有效,跳过加载,返回成功 + adLoadListener?.loaded(cachedAd) + return + } + + val adUnitId = AdsInsUtil.adUnitIdMap[placement] ?: run { + val errorMsg = "No AdUnitId for $placement" + Log.d("ocean","没找到对应的广告ID->$placement") + adLoadListener?.loadFailed(errorMsg) + AnalyticsUtils.logAdEvent( + placement, + AnalyticsUtils.AdEvent.LOAD_FAIL, + null, + errorMsg + ) + return + } + AnalyticsUtils.logAdEvent(placement, AnalyticsUtils.AdEvent.REQ) + + InterstitialAd.load( + activity, + adUnitId, + AdRequest.Builder().build(), + object : InterstitialAdLoadCallback() { + override fun onAdLoaded(ad: InterstitialAd) { + InstAdCacheManager.instance.setAdCache(placement, ad) + AnalyticsUtils.logAdEvent(placement, AnalyticsUtils.AdEvent.LOADED) + adLoadListener?.loaded(ad) + } + + override fun onAdFailedToLoad(adError: LoadAdError) { + AnalyticsUtils.logAdEvent( + placement, + AnalyticsUtils.AdEvent.LOAD_FAIL, + adError.code, + adError.message + ) + adLoadListener?.loadFailed(adError.toString()) + } + }, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstShower.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstShower.kt new file mode 100644 index 0000000..7262911 --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdInstShower.kt @@ -0,0 +1,68 @@ +package com.all.pdfreader.pdf.reader.ad + +import android.app.Activity +import com.all.pdfreader.pdf.reader.ad.AdsInsUtil.AdPlacement +import com.all.pdfreader.pdf.reader.util.AnalyticsUtils +import com.google.android.gms.ads.AdError +import com.google.android.gms.ads.FullScreenContentCallback + +class AdInstShower( + private val activity: Activity, + private val placement: AdPlacement, + private val showListener: ShowListener? +) { + + init { + showAd() + } + + private fun showAd() { + val interstitialAd = InstAdCacheManager.instance.getAdCache(placement) + ?: run { + val errorMsg = "InterstitialAd cache is null for place = $placement" + AnalyticsUtils.logAdEvent( + placement, + AnalyticsUtils.AdEvent.SHOW_FAIL, + null, + errorMsg + ) + showListener?.onAdShowFailed(errorMsg) + return + } + + interstitialAd.fullScreenContentCallback = object : FullScreenContentCallback() { + + override fun onAdShowedFullScreenContent() { + AnalyticsUtils.logAdEvent(placement, AnalyticsUtils.AdEvent.SHOW_SUC) + showListener?.onAdShown() + } + + override fun onAdDismissedFullScreenContent() { + // 用户关闭广告 + InstAdCacheManager.instance.remove(placement) + showListener?.onAdClosed() + } + + override fun onAdFailedToShowFullScreenContent(adError: AdError) { + AnalyticsUtils.logAdEvent( + placement, + AnalyticsUtils.AdEvent.SHOW_FAIL, + adError.code, + adError.message + ) + InstAdCacheManager.instance.remove(placement) + showListener?.onAdShowFailed(adError.toString()) + } + + override fun onAdClicked() { + showListener?.onAdClicked() + } + + override fun onAdImpression() { + // 曝光回调 + } + } + + interstitialAd.show(activity) + } +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdsInsUtil.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdsInsUtil.kt new file mode 100644 index 0000000..774ad9c --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/AdsInsUtil.kt @@ -0,0 +1,82 @@ +package com.all.pdfreader.pdf.reader.ad + +import android.app.Activity + +object AdsInsUtil { + /** 广告位定义(可扩展) */ + enum class AdPlacement(val tag: String) { + SPL_AND_INTO_HOME(Placement.SPL_AND_INTO_HOME), INT_AND_TOPDF(Placement.INT_AND_TOPDF), INT_AND_PDFTOHOME( + Placement.INT_AND_PDFTOHOME + ), + INT_AND_MERGE(Placement.INT_AND_MERGE), INT_AND_SPLIT(Placement.INT_AND_SPLIT), NATIVE_AND_EXIT( + Placement.NATIVE_AND_EXIT + ), + BAN_AND_HOMEPAGE(Placement.BAN_AND_HOMEPAGE) + } + + object Placement { + /** + * 启动页插页 + */ + const val SPL_AND_INTO_HOME = "spl_and_into_home" + + /** + * 在首页/最近页/喜欢页-点击文件进入PDF内容页过程中,弹出缓存的插屏广告 + */ + const val INT_AND_TOPDF = "int_and_topdf" + + /** + * PDF内容页点击返回到首页/最近页/喜欢页过程中,弹出缓存的插屏广告 + */ + const val INT_AND_PDFTOHOME = "int_and_pdftohome" + + /** + * 首页/最近/喜欢-PDF内容页-更多-合并文件(在点击ok后,出现插屏广告,插屏广告结束后到合并成功页面) + */ + const val INT_AND_MERGE = "int_and_merge" + + /** + * 首页/最近/喜欢-PDF内容页-更多-拆分文件(点击ok后,出现插屏广告,插屏广告结束后到拆分成功页面) + */ + const val INT_AND_SPLIT = "int_and_split" + + /** + * 退出提示对话框原生 + */ + const val NATIVE_AND_EXIT = "native_and_exit" + + /** + * 首页横幅 + */ + const val BAN_AND_HOMEPAGE = "ban_and_homepage" + } + + // 广告位对应的广告ID + val adUnitIdMap: Map = mapOf( + AdPlacement.SPL_AND_INTO_HOME to "ca-app-pub-5717753826607607/5211991318", + AdPlacement.INT_AND_TOPDF to "ca-app-pub-5717753826607607/5308904672", + AdPlacement.INT_AND_PDFTOHOME to "ca-app-pub-5717753826607607/7085128570", + AdPlacement.INT_AND_MERGE to "ca-app-pub-5717753826607607/8928693282", + AdPlacement.INT_AND_SPLIT to "ca-app-pub-5717753826607607/2338415962", + AdPlacement.NATIVE_AND_EXIT to "ca-app-pub-5717753826607607/7276700267", + AdPlacement.BAN_AND_HOMEPAGE to "ca-app-pub-5717753826607607/5939567861" + ) + + fun loadAd( + act: Activity, adPlacement: AdPlacement + ): AdInstLoad { + return AdInstLoad(act, adPlacement, null) + } + + fun loadAd( + act: Activity, adPlacement: AdPlacement, loadListener: LoadListener? + ): AdInstLoad { + return AdInstLoad(act, adPlacement, loadListener) + } + + fun showAd( + act: Activity, adPlacement: AdPlacement, listener: ShowListener? + ): AdInstShower { + return AdInstShower(act, adPlacement, listener) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/InstAdCacheManager.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/InstAdCacheManager.kt new file mode 100644 index 0000000..915dcbb --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/InstAdCacheManager.kt @@ -0,0 +1,39 @@ +package com.all.pdfreader.pdf.reader.ad + +import com.google.android.gms.ads.interstitial.InterstitialAd + +class InstAdCacheManager { + private val mAdCacheDict: MutableMap = mutableMapOf() + + companion object { + val instance: InstAdCacheManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + InstAdCacheManager() + } + } + + fun setAdCache(place: AdsInsUtil.AdPlacement, adCache: InterstitialAd) { + mAdCacheDict[place] = CachedAd(adCache) + } + + fun getAdCache(place: AdsInsUtil.AdPlacement): InterstitialAd? { + val cached = mAdCacheDict[place] + return if (cached != null && cached.isValid()) cached.ad + else { + mAdCacheDict.remove(place) // 过期广告清理 + null + } + } + + fun remove(place: AdsInsUtil.AdPlacement) { + mAdCacheDict.remove(place) + } + + + data class CachedAd( + val ad: InterstitialAd, + val loadedAt: Long = System.currentTimeMillis() + ) { + // 广告有效期, 1 小时 + fun isValid(): Boolean = System.currentTimeMillis() - loadedAt < 3600_000 + } +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/LoadListener.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/LoadListener.kt new file mode 100644 index 0000000..d9dfbea --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/LoadListener.kt @@ -0,0 +1,8 @@ +package com.all.pdfreader.pdf.reader.ad + +import com.google.android.gms.ads.interstitial.InterstitialAd + +interface LoadListener { + fun loadFailed(string: String) {} + fun loaded(ad: InterstitialAd) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/ad/ShowListener.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/ShowListener.kt new file mode 100644 index 0000000..c92084d --- /dev/null +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/ad/ShowListener.kt @@ -0,0 +1,8 @@ +package com.all.pdfreader.pdf.reader.ad + +interface ShowListener { + fun onAdShown() {} + fun onAdShowFailed(string: String) {} + fun onAdClosed() {} + fun onAdClicked() {} +} diff --git a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt index cafd4fa..3d38039 100644 --- a/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt +++ b/app/src/main/java/com/all/pdfreader/pdf/reader/util/AnalyticsUtils.kt @@ -2,6 +2,7 @@ package com.all.pdfreader.pdf.reader.util import android.os.Bundle import com.all.pdfreader.pdf.reader.BuildConfig +import com.all.pdfreader.pdf.reader.ad.AdsInsUtil import com.google.firebase.Firebase import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.analytics @@ -97,8 +98,35 @@ object AnalyticsUtils { const val KEEP_SCREEN_CLOSE = "keep_screen_close" // 点击关闭(keep_screen_close) } - /** param 常量 */ + /** param 常量(可扩展) */ object Param { - + const val PLACE = "place" + const val ERROR_CODE = "error_code" + const val ERROR_MSG = "error_msg" } + + /** 广告事件类型 */ + enum class AdEvent(val suffix: String) { + REQ("req_header"), + LOADED("loaded_header"), + LOAD_FAIL("load_fail_header"), + SHOW_SUC("show_suc_header"), + SHOW_FAIL("show_fail_header"), + } + + /** 统一广告打点 */ + fun logAdEvent( + placement: AdsInsUtil.AdPlacement, + event: AdEvent, + errorCode: Int? = null, + errorMsg: String? = null + ) { + val eventName = "${placement.tag}_${event.suffix}" + logEvent(eventName) { + put(Param.PLACE, placement.tag) + errorCode?.let { put(Param.ERROR_CODE, it) } + errorMsg?.let { put(Param.ERROR_MSG, it) } + } + } + } diff --git a/app/src/main/res/xml/net.xml b/app/src/main/res/xml/net.xml new file mode 100644 index 0000000..69cc842 --- /dev/null +++ b/app/src/main/res/xml/net.xml @@ -0,0 +1,6 @@ + + + + mobile-server.lux-ad.com + + diff --git a/settings.gradle.kts b/settings.gradle.kts index aa906bb..20120ae 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.flatDir + pluginManagement { repositories { google { @@ -7,6 +9,7 @@ pluginManagement { includeGroupByRegex("androidx.*") } } + google() mavenCentral() gradlePluginPortal() } @@ -17,6 +20,9 @@ dependencyResolutionManagement { google() mavenCentral() maven("https://jitpack.io") + flatDir { + dirs("libs") + } } }