Thư viện quản lý và tùy chỉnh quảng cáo trong ứng dụng Android một cách linh hoạt, hỗ trợ đa dạng loại quảng cáo và tích hợp GDPR/CMP.
- Quản lý trạng thái VIP với
VipPreferences
- Tùy chỉnh Native Ads dễ dàng qua XML/Code
- Hỗ trợ GDPR/CMP và Remote config (Firebase)
- Quảng cáo đa dạng:
Banner
,Native
,Interstitial
,Rewarded
,Rewarded Interstitial
,App Open
- Tích hợp Adapter cho RecyclerView với
BaseWithAdsAdapter
- Xử lý lifecycle tự động cho quảng cáo
Banner
vàNative
- Hiệu ứng Shimmer khi tải quảng cáo
Banner
vàNative
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
}
}
dependencies {
implementation 'com.github.vtabk2:GsAdmob:1.4.7'
}
-
Tạo 1 application mở rộng GsAdmobApplication ví dụ TestApplication
-
Ở trong
registerAdGsManager()
củaTestApplication
sẽ khởi tạo AdGsManager -
keyVipList
là danh sách các key vip được dùng trong ứng dụng của bạn, xem chi tiết ở VipPreferences-
Mặc định
keyVipList = VipPreferences.defaultKeyVipList
-
Tùy chỉnh các key mình dùng ví dụ sử dụng 2 key
isPro
,isProByYear
keyVipList = mutableListOf("isPro", "isProByYear")
-
Nếu không muốn sử dụng thì khởi tạo
keyVipList = mutableListOf()
-
-
TestApplication
class TestApplication : GsAdmobApplication() { private val mainScope = MainScope() override fun registerAdGsManager() { super.registerAdGsManager() AdGsManager.instance.registerCoroutineScope( application = this, coroutineScope = mainScope, applicationId = BuildConfig.APPLICATION_ID, keyVipList = VipPreferences.defaultKeyVipList, adPlaceNameAppOpenResume = AdGsRemoteExtraConfig.instance.adPlaceNameAppOpenResume, canShowAppOpenResume = { activity -> canShowAppOpenResume && activity !is SplashActivity }, callbackNothingLifecycle = { // 1 số logic cần thiết khác (ví dụ retry vip hoặc Lingver) } ) } }
-
Tạo file
config_admob.xml
trongres/values
:<resources> <!-- App id --> <string name="app_id" translatable="false">ca-app-pub-3940256099942544~3347511713</string> <!-- Ad Unit ids --> <string name="app_open_id" translatable="false">ca-app-pub-3940256099942544/9257395921</string> <string name="app_open_id_resume" translatable="false">ca-app-pub-3940256099942544/9257395921</string> <string name="banner_id" translatable="false">ca-app-pub-3940256099942544/9214589741</string> <string name="banner_id_home" translatable="false">ca-app-pub-3940256099942544/9214589741</string> <string name="banner_id_collapsible" translatable="false">ca-app-pub-3940256099942544/2014213617</string> <string name="interstitial_id" translatable="false">ca-app-pub-3940256099942544/1033173712</string> <string name="interstitial_id_without_video" translatable="false">ca-app-pub-3940256099942544/1033173712</string> <string name="native_id" translatable="false">ca-app-pub-3940256099942544/2247696110</string> <string name="native_id_language" translatable="false">ca-app-pub-3940256099942544/2247696110</string> <string name="rewarded_id" translatable="false">ca-app-pub-3940256099942544/5224354917</string> <string name="rewarded_interstitial_id" translatable="false">ca-app-pub-3940256099942544/5354046379</string> </resources>
-
Đổi string của dialog GDPR/CMP nếu trong ứng dụng có sử dụng quảng cáo trả thưởng:
Rewarded
hoặcRewarded Interstitial
<string name="ads_msg_gdpr">@string/msg_gdpr</string> <string name="ads_text_grant_permission">@string/text_grant_permission</string>
- Sử dụng AdGsSplashManager để tải và hiển thị quảng cáo cho màn hình splash
Hướng dẫn chi tiết cách dùng xem ở SplashActivity
-
Khởi tạo
AdGsSplashManager
AdGsSplashManager( this@SplashActivity, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameSplash, onRetryAdPlaceNameListener = object : AdGsSplashManager.OnRetryAdPlaceNameListener { override fun getAdPlaceName(): AdPlaceName { return AdGsRemoteExtraConfig.instance.adPlaceNameSplash } }, goToHomeCallback = { goToHome() }, initMobileAds = { TestApplication.applicationContext().initMobileAds() }, adsLoading = { bindingView?.clBlur?.isVisible = it }, isDebug = BuildConfig.DEBUG )
-
Mặc định
timeout = 3500
có thể thay đổi khi khởi tạoAdGsSplashManager
-
Cấu hình ở Application
Các giá trị có thể tùy chỉnh :
-
adPlaceNameAppOpenResume
là quảng cáo app open resume bạn muốn dùng (mặc định adPlaceNameAppOpenResume = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_APP_OPEN_RESUME) -
canShowAppOpenResume
điều kiện để hiển thị quảng cáo app open resume (mặc định canShowAppOpenResume = { false }) -
requireScreenAdLoading
để tùy chỉnh có hiển thị màn hình chờ tải quảng cáo app open resume không? (mặc định requireScreenAdLoading = true)
-
-
Khi có sử dụng RemoteConfig thì khởi tạo
RemoteConfig.instance.initRemoteConfig()
trướcoverride fun registerAdGsManager() { super.registerAdGsManager() RemoteConfig.instance.initRemoteConfig( application = this, remoteConfigDefaultsId = R.xml.remote_config_defaults, isDebug = BuildConfig.DEBUG ) AdGsManager.instance.registerCoroutineScope( application = this, coroutineScope = mainScope, applicationId = BuildConfig.APPLICATION_ID, keyVipList = VipPreferences.defaultKeyVipList, adPlaceNameAppOpenResume = AdGsRemoteExtraConfig.instance.adPlaceNameAppOpenResume, canShowAppOpenResume = { activity -> canShowAppOpenResume && activity !is SplashActivity }, callbackNothingLifecycle = { // 1 số logic cần thiết khác (ví dụ retry vip hoặc Lingver) } ) }
-
Khi không sử dụng RemoteConfig
override fun registerAdGsManager() { super.registerAdGsManager() AdGsManager.instance.registerCoroutineScope( application = this, coroutineScope = mainScope, applicationId = BuildConfig.APPLICATION_ID, keyVipList = VipPreferences.defaultKeyVipList, adPlaceNameAppOpenResume = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_APP_OPEN_RESUME, canShowAppOpenResume = { activity -> canShowAppOpenResume && activity !is SplashActivity }, callbackNothingLifecycle = { // 1 số logic cần thiết khác (ví dụ retry vip hoặc Lingver) } ) }
-
Khi không muốn có màn hình chờ tải quảng cáo thì dùng
requireScreenAdLoading = false
khi khởi tạoAdGsManager.instance.registerCoroutineScope()
-
Khai báo trong xml:
<com.core.gsadmob.banner.BannerGsAdView android:id="@+id/bannerView" android:layout_width="match_parent" android:layout_height="wrap_content"/>
-
Tải quảng cáo với adPlaceName mặc định ở AdPlaceNameDefaultConfig
AdGsManager.instance.registerBanner( lifecycleOwner = this, adPlaceName = AdPlaceNameDefaultConfig.HOME_BANNER, bannerGsAdView = binding.bannerView )
-
Khi đã cấu hình Remote Config ở AdGsRemoteExtraConfig
AdGsManager.instance.registerBanner( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameBannerHome, bannerGsAdView = bindingView.bannerView )
-
Khi không muốn sử dụng shimmer
useShimmer = false
AdGsManager.instance.registerBanner( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameBannerHome, bannerGsAdView = bindingView.bannerView, useShimmer = false )
-
Hiển thị quảng cáo xen kẽ
AdGsManager.instance.showAd(adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_INTERSTITIAL) AdGsManager.instance.showAd(adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_INTERSTITIAL_WITHOUT_VIDEO)
-
Quảng cáo Native ở bên ngoài (khi không muốn sử dụng shimmer thì dùng
useShimmer = false
)AdGsManager.instance.registerNative( lifecycleOwner = this, adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_NATIVE, nativeGsAdView = bindingView.nativeFrame, useShimmer = true )
-
Quảng cáo Native ở trong RecyclerView (khi không muốn sử dụng shimmer thì dùng
useShimmer = false
)AdGsManager.instance.registerNative( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameNativeHome, callbackSuccess = { nativeAdGsData, isStartShimmer -> adapter?.setupItemAds(nativeAd = nativeAdGsData?.nativeAd, isStartShimmer = isStartShimmer, useShimmer = true) } )
-
Tự do chuyển đổi giữ quảng cáo Native và Banner (khi không muốn sử dụng shimmer thì dùng
useShimmer = false
)AdGsManager.instance.registerNativeOrBanner( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameLanguage, bannerGsAdView = bindingView.bannerView, nativeGsAdView = bindingView.nativeLanguage, useShimmer = true )
-
Tạm ẩn quảng cáo native
bindingView.nativeFrame.hide()
-
Hiển thị lại quảng cáo native đã ẩn
bindingView.nativeFrame.show()
-
Mặc định AdPlaceName:
-
AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED là adPlaceName của quảng cáo Rewarded
-
AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED_INTERSTITIAL là adPlaceName của quảng cáo Rewarded Interstitial
-
-
Trường hợp có một quảng cáo trả thưởng:
- Khởi tạo luôn adPlaceName
val adGsRewardedManager = AdGsRewardedManager( activity = this, adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED_INTERSTITIAL, isDebug = BuildConfig.DEBUG )
- Sử dụng:
adGsRewardedManager?.showAds( callback = { typeShowAds -> })
-
Trường hợp có nhiều quảng cáo trả thưởng:
- Khởi tạo:
val adGsRewardedManager = AdGsRewardedManager( activity = this, isDebug = BuildConfig.DEBUG )
- Sử dụng:
adGsRewardedManager?.showAds( adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED_INTERSTITIAL, callback = { typeShowAds -> })
- Hủy hiển thị quảng cáo trả thưởng (chỉ có tác dụng khi quảng cáo trả thưởng chưa hiển thị)
AdGsManager.instance.cancelRewardAd(adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED) AdGsManager.instance.cancelRewardAd(adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_REWARDED_INTERSTITIAL)
-
Thay đổi text
<string name="ad_text_welcome_back">Welcome back</string>
-
Thay đổi animation LottieAppOpenResume
<style name="LottieAppOpenResume" parent="ads_LottieAppOpenResume"> </style>
-
Thay đổi TextAppOpenResume
<style name="TextAppOpenResume" parent="ads_TextAppOpenResume"> </style>
-
Thay đổi blurOverlayColor App open resume
<color name="ad_blurOverlayColor">#80000000</color>
-
Thay đổi thời gian giữa 2 lần hiển thị
AdGsManager.instance.registerDelayShowTime(delayShowTime = 30, adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_APP_OPEN_RESUME)
-
Đổi màu nền banner với
adsBannerGsBackgroundColor
app:adsBannerGsBackgroundColor="@android:color/holo_green_dark"
-
Thay đổi kiểu hiển thị với
adsShowType
app:adsShowType="alwaysShow"
adsShowType Trạng thái showIfSuccess Quảng cáo chỉ chiếm kích thước và hiển thị khi quảng cáo được tải thành công alwaysShow Quảng cáo luôn chiếm kích thước và hiển thị nếu quảng cáo đươc tải thành công hide Ẩn quảng cáo đi nhưng vẫn chiếm kích thước và không hiển thị ngay cả khi quảng cáo được tải thành công (được dùng khi đang show quảng cáo app open hiển thị thì tạm ẩn banner đi chẳng hạn) notShow Ẩn quảng cáo đi không chiếm kích thước và không hiển thị ngày cả khi quảng cáo được tải thành công -
Ví dụ
<com.core.gsadmob.banner.BannerGsAdView android:id="@+id/bannerView" android:layout_width="match_parent" android:layout_height="60dp" app:adsBannerGsBackgroundColor="@android:color/holo_green_dark" app:adsShowType="alwaysShow" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/>
-
Bắt các sự kiện của quảng cáo
adGsExtendListener
,adGsListener
AdGsManager.instance.registerBanner( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameBannerHome, bannerGsAdView = bindingView.bannerView, useShimmer = false, adGsListener = object : AdGsListener { }, adGsExtendListener = object : AdGsExtendListener { override fun onAdClicked() { Log.d("TAG5", "HomeActivity_onAdClicked: adPlaceNameBannerHome") } } )
adsNativeMode | Trạng thái |
---|---|
none | (Mặc định) Không hiển thị quảng cáo |
album | Quảng cáo mẫu album |
font | Quảng cáo mẫu font |
frame | Quảng cáo mẫu frame |
language | Quảng cáo mẫu language |
share | Quảng cáo mẫu share |
sticker | Quảng cáo mẫu sticker |
template | Quảng cáo mẫu template |
vip | Quảng cáo mẫu vip |
custom ⭐⭐⭐ | Khi muốn tự tùy chỉnh quảng cáo native với giao diện mới |
-
Dùng các adsNativeMode mặc định (album, font, frame...)
<com.core.gsadmob.natives.view.NativeGsAdView android:id="@+id/nativeAdView" android:layout_width="match_parent" android:layout_height="wrap_content" app:adsNativeMode="album"/>
-
Dùng mode custom và sử dụng id gốc, chỉ thay đổi layout
<com.core.gsadmob.natives.view.NativeGsAdView android:id="@+id/nativeLanguage" android:layout_width="match_parent" android:layout_height="wrap_content" app:adsLayoutId="@layout/ad_native_custom" app:adsLayoutShimmerId="@layout/ad_native_custom_shimmer" app:adsNativeMode="custom"/>
-
Dùng mode custom và thay đổi hết id thì tốt nhất là tạo style
<style name="NativeTest" parent="ads_BaseNativeCustom"> <item name="adsLayoutId">@layout/ad_native_test</item> <item name="adsLayoutShimmerId">@layout/ad_native_test_shimmer</item> <item name="adsHeadlineId">@id/ad_headline_test</item> <item name="adsBodyId">@id/ad_body_test</item> <item name="adsStarsId">@id/ad_stars_test</item> <item name="adsAppIconId">@id/ad_app_icon_test</item> <item name="adsCallToActionId">@id/ad_call_to_action_test</item> <item name="adsViewId">@id/ad_view_test</item> <item name="adsShimmerId">@id/ad_shimmer_test</item> <item name="adsNativeViewRoot">@style/ads_NativeAlbumRoot</item> </style>
<com.core.gsadmob.natives.view.NativeGsAdView android:id="@+id/nativeLanguage" style="@style/NativeTest" android:layout_width="match_parent" android:layout_height="wrap_content"/>
-
Dùng các
adsNativeMode
mặc định (album, font, frame...)applyBuilder(NativeDefaultConfig.BUILDER_ALBUM)
-
Dùng mode custom và sử dụng id gốc, chỉ thay đổi layout
val builder = BaseNativeAdView.Builder().apply { adsLayoutId = R.layout.ad_native_test adsLayoutShimmerId = R.layout.ad_native_test_shimmer adsNativeMode = AdsNativeMode.CUSTOM } binding.nativeAdView.applyBuilder(builder)
-
Tùy chỉnh toàn bộ id
val builder = BaseNativeAdView.Builder().apply { adsLayoutId = R.layout.ad_native_test adsLayoutShimmerId = R.layout.ad_native_test_shimmer adsHeadlineId = R.id.ad_headline_test adsBodyId = R.id.ad_body_test adsStarsId = R.id.ad_stars_test adsAppIconId = R.id.ad_app_icon_test adsCallToActionId = R.id.ad_call_to_action_test adsViewId = R.id.ad_view_test adsShimmerId = R.id.ad_shimmer_test adsNativeViewRoot = R.style.ads_NativeTestRoot adsNativeMode = AdsNativeMode.CUSTOM } binding.nativeAdView.applyBuilder(builder)
-
Dùng style có sẵn
binding.nativeAdView.setStyle(R.style.NativeFont)
-
Dùng style tự tạo ví dụ như
NativeTest
đã tạo ở trênbinding.nativeAdView.setStyle(R.style.NativeTest) bindingView.nativeTest1.setStyle(com.core.gsadmob.R.style.NativeFont)
-
Bắt các sự kiện của quảng cáo
adGsExtendListener
,adGsListener
AdGsManager.instance.registerNative( lifecycleOwner = this, adPlaceName = AdGsRemoteExtraConfig.instance.adPlaceNameNativeHome, callbackSuccess = { nativeAdGsData, isStartShimmer -> adapter?.setupItemAds(nativeAd = nativeAdGsData?.nativeAd, isStartShimmer = isStartShimmer, useShimmer = true) }, adGsListener = object : AdGsListener { }, adGsExtendListener = object : AdGsExtendListener{ override fun onAdClicked() { Log.d("TAG5", "HomeActivity_onAdClicked: adPlaceNameNativeHome") } } )
3. Tùy chỉnh các mẫu native có sẵn xem ở config_admob.xml
<!-- album-->
<color name="ads_text_color_headline_album">@android:color/white</color>
<color name="ads_text_color_body_album">@android:color/white</color>
<color name="ads_text_color_attribution_album">@android:color/white</color>
<color name="ads_text_color_call_button_album">@color/selector_color_white_black</color>
<color name="ads_call_button_album">#14B261</color>
<color name="ads_call_button_album_pressed">#DFE1E6</color>
<color name="ads_bg_color_album">#212121</color>
<color name="ads_bg_text_ad_album_color">#15C969</color>
<drawable name="ads_bg_album">@drawable/ads__bg_album</drawable>
<drawable name="ads_bg_text_ad_album">@drawable/ads__bg_text_ad_album</drawable>
<drawable name="ads_bg_call_action_button_album">
@drawable/ads_selector_bg_call_action_button_album
</drawable>
<bool name="ads_call_button_album_textAllCaps">false</bool>
<dimen name="ads_text_size_headline_album">15sp</dimen>
<dimen name="ads_text_size_body_album">13sp</dimen>
<dimen name="ads_text_size_attribution_album">8sp</dimen>
<dimen name="ads_text_size_call_to_action_album">14sp</dimen>
<dimen name="ads_height_call_to_action_album">32dp</dimen>
<dimen name="ads_radius_call_to_action_album">10dp</dimen>
<dimen name="ads_padding_bottom_call_to_action_album">6dp</dimen>
<dimen name="ads_padding_left_call_to_action_album">10dp</dimen>
<dimen name="ads_padding_right_call_to_action_album">10dp</dimen>
<dimen name="ads_padding_top_call_to_action_album">6dp</dimen>
<dimen name="ads_radius_bg_album">0dp</dimen>
<dimen name="ads_bg_text_ad_album_radius">5dp</dimen>
<dimen name="ads_bg_text_ad_album_padding_bottom">2dp</dimen>
<dimen name="ads_bg_text_ad_album_padding_left">@dimen/ads_bg_text_ad_album_radius</dimen>
<dimen name="ads_bg_text_ad_album_padding_right">@dimen/ads_bg_text_ad_album_radius</dimen>
<dimen name="ads_bg_text_ad_album_padding_top">2dp</dimen>
<style name="ads_NativeAlbumRoot" parent="ads_BaseNativeAdViewRoot">
</style>
-
Thay đổi kích thước margin của quảng cáo
<style name="ads_NativeAlbumRoot" parent="ads_BaseNativeAdViewRoot"> <item name="android:layout_marginStart">6dp</item> <item name="android:layout_marginEnd">6dp</item> <item name="android:layout_marginBottom">8dp</item> </style>
<!-- shimmer root-->
<color name="ads_bg_shimmer_root_color">#CACACA</color>
<color name="ads_bg_banner_shimmer_root_color">#CACACA</color>
<drawable name="ads_bg_shimmer_album">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_custom">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_font">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_frame">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_language">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_share">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_sticker">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_template">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_shimmer_vip">@drawable/ads__bg_shimmer_root</drawable>
<drawable name="ads_bg_banner_shimmer_root">@drawable/ads__bg_banner_shimmer_root</drawable>
<dimen name="ads_bg_shimmer_root_radius">0dp</dimen>
<dimen name="ads_bg_banner_shimmer_root_radius">0dp</dimen>
<!-- shimmer-->
<color name="ads_bg_shimmer_color">#80000000</color>
<drawable name="ads_bg_shimmer">@drawable/ads__bg_shimmer</drawable>
<dimen name="ads_bg_shimmer_radius">5dp</dimen>
<style name="ads_RatingBar" parent="Theme.AppCompat">
<item name="colorControlNormal">#FFBF1C</item>
<item name="colorControlActivated">#FFBF1C</item>
</style>
3.4. Tùy chỉnh quảng cáo Native trong RecyclerView bằng cách dùng BaseWithAdsAdapter
Hướng dẫn chi tiết xem ImageAdapter
-
Khi muốn thay đổi giao diện quảng cáo
override val nativeAdLayoutId: Int = R.layout.item_ads_image
-
Khi muốn thay đổi id của
NativeGsAdView
override val nativeAdId: Int = R.id.nativeAd
-
Khởi tạo giao diện các item khác
override onCreateItemViewHolder
-
Cập nhật dữ liệu vào giao diện item
override onBindItemViewHolder
-
Khởi tạo giao diên quảng cáo
override onCreateAdViewHolder
-
Cập nhật dữ liệu vào giao diện quảng cáo
override onBindAdViewHolder
-
Kích hoạt chức năng thay đổi trạng thái CallActionButton
override canCheckUpdateCallActionButton
-
Lấy res cho CallActionButton và chỉ có tác dụng khi canCheckUpdateCallActionButton = true
override getBackgroundResourceCallActionButton
-
Cập nhật dữ liệu mà không dùng DiffUtil
setData()
-
Cập nhật dữ liệu có sử dụng DiffUtil
setDataWithCalculateDiff()
-
Kiểm tra xem 2 đối tượng có giống nhau không?
override fun areItemsTheSameDiff(oldItem: Any, newItem: Any)
-
Kiểm tra xem 2 đối tượng có dữ liệu giống nhau không và chỉ được gọi khi areItemsTheSameDiff = true
override fun areContentsTheSameDiff(oldItem: Any, newItem: Any)
-
-
Bắt các sự kiện của quảng cáo
AdGsManager.instance.registerAndShowAds
AdGsManager.instance.registerAndShowAds
-
Bắt các sự kiện mở rộng của quảng cáo
adGsExtendListener
AdGsManager.instance.showAd( adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_INTERSTITIAL, adGsExtendListener = object : AdGsExtendListener { override fun onAdClicked() { Log.d("TAG5", "TestAdsActivity_onAdClicked: AD_PLACE_NAME_INTERSTITIAL") } })
-
Thay đổi thời gian giữa 2 lần hiển thị
AdGsManager.instance.registerDelayShowTime(delayShowTime = 30, adPlaceName = AdPlaceNameDefaultConfig.instance.AD_PLACE_NAME_INTERSTITIAL)
-
Lưu 1 key mới
fun save(key: String, value: Boolean) {}
-
Lấy giá trị từ 1 key mới
fun load(key: String, valueDefault: Boolean = false) {}
-
Có thể dùng các biến mặc định như isPro, isProByYear, isProByMonth
- Tạo file
remote_config_defaults.xml
ở thư mụcres/xml
- Tạo file RemoteConfig sẽ mở rộng AdGsRemoteConfig
Bên trong updateRemoteConfig
của RemoteConfig
là nơi lấy các cấu hình từ RemoteConfig trên Firebase
-
Khởi tạo trong
registerAdGsManager()
ở ApplicationRemoteConfig.instance.initRemoteConfig( application = this, remoteConfigDefaultsId = R.xml.remote_config_defaults, isDebug = BuildConfig.DEBUG )
-
Tạo AdGsRemoteExtraConfig nơi này sẽ quản lý các quảng cáo có trong ứng dụng để RemoteConfig cập nhật thông tin từ RemoteConfig vào
-
Sửa lỗi webview, truyền getPackageName() của ứng dụng vào
override fun fixWebView(packageName: String) { super.fixWebView(getPackageName()) }
-
Cài đặt có dùng thiết bị thành máy test không, super.setupDeviceTest(true) sẽ cho thiết bị thành máy test
override fun setupDeviceTest(isDebug: Boolean) { super.setupDeviceTest(BuildConfig.DEBUG) }
- Cấu hình để BottomSheet không bị giật khi di chuyển từ dưới lên
Thêm bottomSheetDialogTheme vào style gốc của ứng dụng
<item name="bottomSheetDialogTheme">@style/BaseBottomSheetDialogTheme</item>
hoặc mở rộng style gốc với Base.Theme.GsAdmob
<style name="Theme.GsAdmob" parent="Base.Theme.GsAdmob"/>
Nếu thư viện này giúp ích cho bạn theo bất kỳ cách nào, hãy thể hiện tình yêu của bạn ❤️ bằng cách đặt ⭐ vào dự án này ✌️️
MIT License
Copyright (c) [2025] [Vũ Tuấn Anh]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Mọi đóng góp vui lòng tạo Pull requests
hoặc Issues
trên GitHub.