FullScreenContentCallback - onAdDismissedFullScreenContent never called - android

I'm using the newest ads play services (21.4.0) and see following behaviour (testing with test app id and test ad ids):
The onAdDismissedFullScreenContent function of FullScreenContentCallback is never called.
Problem
When I click the close button inside the interstitial ad no callback function is called... All other functions inside (at least the non error functions) are called successfully. Why? Am I missing something? I need to react to the event that the ad is being dismissed...
Code
load the ad
InterstitialAd.load(
context,
adId,
AdRequest.Builder().build(),
createInterstitialAdListener()
)
wait for the ad to be loaded inside the listener
private fun createInterstitialAdListener(): InterstitialAdLoadCallback {
return object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
super.onAdLoaded(ad)
L.d { "Interstitial ad loaded..." }
ad.fullScreenContentCallback = createFullScreenContentCallback("Interstitial")
interstitialAd = ad
this#AdsViewManager.onAdLoaded()
}
override fun onAdFailedToLoad(error: LoadAdError) {
super.onAdFailedToLoad(error)
onAdLoadingError(error.message)
}
}
}
private fun createFullScreenContentCallback(type: String): FullScreenContentCallback {
return object : FullScreenContentCallback() {
override fun onAdClicked() {
// works!
L.d { "[$type] FullScreen ad clicked" }
}
override fun onAdDismissedFullScreenContent() {
// never gets called!
L.d { "[$type] FullScreen ad dismissed" }
interstitialAd = null
rewardedAd = null
}
override fun onAdFailedToShowFullScreenContent(error: AdError) {
onAdLoadingError(error.message)
interstitialAd = null
rewardedAd = null
}
override fun onAdImpression() {
// works!
L.d { "[$type] FullScreen ad - IMPRESSION" }
}
override fun onAdShowedFullScreenContent() {
// works!
L.d { "[$type] FullScreen ad showed..." }
}
}
}
show the ad when it is ready
fun show() {
if (interstitialAd == null) {
L.e { "Interstitial ad not ready" }
} else {
interstitialAd?.show(activity)
L.d { "Showing interstitial ad..." }
}
}
Logs from code above
Interstitial ad loaded...
Showing interstitial ad...
[Interstitial] FullScreen ad showed...
[Interstitial] FullScreen ad - IMPRESSION
// missing the close log... it never appears...

Try in this manner, in your Activity
private var interstitialAd: InterstitialAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
createInterstitialAdListener()
}
Your loadAd function
private fun createInterstitialAdListener(): InterstitialAdLoadCallback {
return object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
super.onAdLoaded(ad)
L.d { "Interstitial ad loaded..." }
interstitialAd = ad
this#AdsViewManager.onAdLoaded()
}
override fun onAdFailedToLoad(error: LoadAdError) {
super.onAdFailedToLoad(error)
onAdLoadingError(error.message)
}
}
}
While showing Ad, copy/paste following...
fun show() {
if (interstitialAd == null) {
L.e { "Interstitial ad not ready" }
} else {
interstitialAd?.fullScreenContentCallback = fullScreenContentCallback
interstitialAd?.show(activity)
L.d { "Showing interstitial ad..." }
}
}
private val fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdClicked() {
// works!
L.d { "[$type] FullScreen ad clicked" }
}
override fun onAdDismissedFullScreenContent() {
// never gets called!
L.d { "[$type] FullScreen ad dismissed" }
interstitialAd = null
rewardedAd = null
}
override fun onAdFailedToShowFullScreenContent(error: AdError) {
onAdLoadingError(error.message)
interstitialAd = null
rewardedAd = null
}
override fun onAdImpression() {
// works!
L.d { "[$type] FullScreen ad - IMPRESSION" }
}
override fun onAdShowedFullScreenContent() {
// works!
L.d { "[$type] FullScreen ad showed..." }
}
}
}
It will work as expected. Let me know, if it didn't work

Related

I updated admob dependencies. Is InterstitialAd is deprecated, How do I resolve this? [duplicate]

After updating com.google.android.gms:play-services-ads to 19.7.0
it says InterstitialAd & RewardedVideoAd & UnifiedNativeAdView deprecated.
can anyone help ?
after a quick search, I found that we need to use
public abstract class InterstitialAd extends Object
instead of
public final class InterstitialAd extends Object
so you need to use:
com.google.android.gms.ads.interstitial.InterstitialAd
instead of:
come.google.android.gms.ads
and this is how we interact with the new package:
public class AdManager
{
private var interstitialAd: InterstitialAd? = null
private var mRewardedVideoAd: RewardedAd? = null
private var currentNativeAd: NativeAd? = null
private var builder: AdLoader.Builder? = null
init {
RequestConfiguration.Builder().setTestDeviceIds(
listOf(
AdRequest.DEVICE_ID_EMULATOR,
"CE88B9A1CB213EEEA19A2F7E54993908"
)
)
}
// Create a full screen content callback.
val fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
super.onAdFailedToShowFullScreenContent(p0)
}
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
interstitialAd = null
mRewardedVideoAd = null
}
}
fun createInterstitialAd(context: Context) {
InterstitialAd.load(
context,
BuildConfig.ADMOB_AD_INTERSTITIAL_UNIT_ID,
request.build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
interstitialAd = ad
interstitialAd?.fullScreenContentCallback = fullScreenContentCallback
}
})
}
}
fun getFullScreenAd(): InterstitialAd? {
return interstitialAd
}
fun getVideoAd(): RewardedAd? {
return mRewardedVideoAd
}
fun loadRewardedVideoAd(context: Context) {
if (!userManager.getCurrentUser().isPremium) {
val request = AdRequest.Builder()
RewardedAd.load(
context,
BuildConfig.ADMOB_AD_VIDEO_UNIT_ID,
AdRequest.Builder().build(),
object : RewardedAdLoadCallback() {
override fun onAdLoaded(ad: RewardedAd) {
super.onAdLoaded(ad)
mRewardedVideoAd = ad;
mRewardedVideoAd?.fullScreenContentCallback = fullScreenContentCallback;
}
override fun onAdFailedToLoad(p0: LoadAdError) {
super.onAdFailedToLoad(p0)
}
})
}
fun loadNativeAd(context: Activity,adFrame:FrameLayout) {
builder = AdLoader.Builder(context, BuildConfig.ADMOB_AD_UNIT_ID_DIALOG_NATIVE)
builder?.forNativeAd { unifiedNativeAd: NativeAd ->
val adView: View =
context.layoutInflater.inflate(R.layout.ad_unified, null)
val ad = adView as NativeAdView
populateUnifiedNativeAdView(unifiedNativeAd, ad)
adFrame.removeAllViews()
adFrame.addView(ad)
}
val adLoader = builder?.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(i: LoadAdError) {
super.onAdFailedToLoad(i)
Log.e("NativeAdFailed", i.toString() + "")
}
})?.build()
val builder = AdManagerAdRequest.Builder()
adLoader?.loadAd(builder.build())
}
}
private fun populateUnifiedNativeAdView(
nativeAd: NativeAd,
adView: NativeAdView
) {
// You must call destroy on old ads when you are done with them,
// otherwise you will have a memory leak.
if (currentNativeAd != null) currentNativeAd?.destroy()
currentNativeAd = nativeAd
// Set the media view.
adView.mediaView = adView.findViewById<View>(R.id.ad_media) as com.google.android.gms.ads.nativead.MediaView
// Set other ad assets.
adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.bodyView = adView.findViewById(R.id.ad_body)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.iconView = adView.findViewById(R.id.ad_app_icon)
adView.priceView = adView.findViewById(R.id.ad_price)
adView.starRatingView = adView.findViewById(R.id.ad_stars)
adView.storeView = adView.findViewById(R.id.ad_store)
adView.advertiserView = adView.findViewById(R.id.ad_advertiser)
// The headline and media content are guaranteed to be in every UnifiedNativeAd.
(adView.headlineView as TextView).text = nativeAd.headline
nativeAd.mediaContent?.let {
adView.mediaView?.setMediaContent(it)
}
// These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
// check before trying to display them.
if (nativeAd.body == null) {
adView.bodyView?.visibility = View.INVISIBLE
} else {
adView.bodyView?.visibility = View.VISIBLE
(adView.bodyView as TextView).text = nativeAd.body
}
if (nativeAd.callToAction == null) {
adView.callToActionView?.visibility = View.INVISIBLE
} else {
adView.callToActionView?.visibility = View.VISIBLE
(adView.callToActionView as TextView).text = nativeAd.callToAction
}
if (nativeAd.icon == null) {
adView.iconView?.visibility = View.GONE
} else {
(adView.iconView as ImageView).setImageDrawable(
nativeAd.icon?.drawable
)
adView.iconView?.visibility = View.VISIBLE
}
if (nativeAd.price == null) {
adView.priceView?.visibility = View.INVISIBLE
} else {
adView.priceView?.visibility = View.VISIBLE
(adView.priceView as TextView).text = nativeAd.price
}
if (nativeAd.store == null) {
adView.storeView?.visibility = View.INVISIBLE
} else {
adView.storeView?.visibility = View.VISIBLE
(adView.storeView as TextView).text = nativeAd.store
}
if (nativeAd.starRating == null) {
adView.starRatingView?.visibility = View.INVISIBLE
} else {
nativeAd.starRating?.toDouble()?.let {
(adView.starRatingView as RatingBar).rating = it.toFloat()
adView.starRatingView?.visibility = View.VISIBLE
}
}
if (nativeAd.advertiser == null) {
adView.advertiserView?.visibility = View.INVISIBLE
} else {
(adView.advertiserView as TextView).text = nativeAd.advertiser
adView.advertiserView?.visibility = View.VISIBLE
}
// This method tells the Google Mobile Ads SDK that you have finished populating your
// native ad view with this native ad.
adView.setNativeAd(nativeAd)
}
}
There are many breaking changes coming in version 20.0.0. Version
19.7.0 introduced many new APIs, and deprecated or renamed many classes in preparation for version 20.0.0.
This code explains how to integrate interstitial ads in v 19.7.0
class Web : AppCompatActivity() {
private var mInterstitialAd: InterstitialAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_web)
// load ad
loadAd();
toNextLevel()
}
// load ad
private fun loadAd() {
InterstitialAd.load(
this#Web,
"ca-app-pub-3940256099942544/1033173712",
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(interstitialAd: InterstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd
mInterstitialAd?.fullScreenContentCallback =
object : FullScreenContentCallback() {
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
mInterstitialAd = null
//// perform your code that you wants to do after ad dismissed or closed
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
mInterstitialAd = null
/// perform your action here when ad will not load
}
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
this#Web.mInterstitialAd = null
}
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
// Handle the error
mInterstitialAd = null
}
})
}
private fun toNextLevel() {
// Show the interstitial if it is ready. Otherwise, proceed to the next level
// without ever showing it
if (mInterstitialAd != null) {
mInterstitialAd?.show(this#Web)
} else {
nextLevel()
// in case you want to load a new ad
requestNewInterstitial()
}
}
private fun nextLevel() {
TODO("Not yet implemented")
}
private fun requestNewInterstitial() {
if (mInterstitialAd == null) {
loadAd()
}
}
}
use com.google.android.gms.ads.interstitial.InterstitialAd
instead of
come.google.android.gms.ads
when you upgrade the admob sdk to
implementation 'com.google.firebase:firebase-ads:19.7.0'
you will found the old sdk method deprecated like InterstitialAD
Its Simple here just follow my way to load your interstitial and remove deprecation here its my sample code for better ad request load your add in the On start in your activity if you have any query kindly let me know below in comments copy paste the below code:
public static AdRequest adRequest;
public static InterstitialAd mInterstitialAd;
public void InterstitialAdmob() {
InterstitialAd.load(MainActivity.this,getString(R.string.Interstitial), adRequest, new InterstitialAdLoadCallback() {
#Override
public void onAdLoaded(#NonNull InterstitialAd interstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd;
mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){
#Override
public void onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent();
mInterstitialAd=null;
//// perform your code that you wants todo after ad dismissed or closed
}
#Override
public void onAdFailedToShowFullScreenContent(com.google.android.gms.ads.AdError adError) {
super.onAdFailedToShowFullScreenContent(adError);
mInterstitialAd = null;
/// perform your action here when ad will not load
}
#Override
public void onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent();
mInterstitialAd = null;
}
});
}
#Override
public void onAdFailedToLoad(#NonNull LoadAdError loadAdError) {
// Handle the error
mInterstitialAd = null;
}
});
}
#Override
protected void onStart() {
super.onStart();
measyrating.onStart();
adRequest = new AdRequest.Builder().build();
InterstitialAdmob();
}
Now show your ads simply on backpressed or button click
#Override
public void onBackPressed() {
if (mInterstitialAd!=null){
mInterstitialAd.show(MainActivity.this);
}
else{
if (doubleBackToExitPressedOnce) {
if (mBottomNavigationView.getSelectedItemId() == R.id.navigation_doc)
{
super.onBackPressed();
}
else
{
mBottomNavigationView.setSelectedItemId(R.id.navigation_doc);
}
return;
}
this.doubleBackToExitPressedOnce = true;
if (this.drawer.isDrawerOpen(GravityCompat.START)) {
this.drawer.closeDrawer(GravityCompat.START);
}
if (itempositionselected==0){
loadFragment(new DocxFileFragment());
}
else {
}
if (!searchView.isIconified()) {
searchView.setIconified(true);
}
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
}
Google Mobile Ads SDK version 20.0.0 is planned for early 2021 and comes with a few major changes, as well as several straightforward API renames and removal of deprecated APIs.
You can check more details on this link.
Use NativeAdView instead of UnifiedNativeAdView and so on.
Following page has example and details for newer version of interstitial ad
https://developers.google.com/admob/android/interstitial
Below is a full working example based on above i am using with current versioncom.google.android.gms:play-services-ads:20.2.0:
public class BriefDisplayActivity extends AppCompatActivity {
InterstitialAd briefInterstitialAd;
AdRequest adRequest_I = new AdRequest.Builder().build();
InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712", adRequest_I,
new InterstitialAdLoadCallback() {
#Override
public void onAdLoaded(#NonNull InterstitialAd interstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
BriefDisplayActivity.this.briefInterstitialAd = interstitialAd;
Log.i(TAG, "onAdLoaded");
briefInterstitialAd.show(BriefDisplayActivity.this);
}
#Override
public void onAdFailedToLoad(#NonNull LoadAdError loadAdError) {
// Handle the error
Log.i(TAG, loadAdError.getMessage());
BriefDisplayActivity.this.briefInterstitialAd = null;
}
});
}

How can I re-upload after I close the Admob 2021 interstitial?

I'm switching to the new Admob 2021 interstitials. New InterstitialAd My main event has 10 episodes and no matter which one I switch to, an interstitial ad will appear. However, when I got back to the event, I noticed that it wasn't showing again. What I want to do is reload after closing the interstitial ad.
public class MainActivity extends Activity {
private InterstitialAd mInterstitialAd;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this, new OnInitializationCompleteListener() {
#Override
public void onInitializationComplete(InitializationStatus initializationStatus) {}
});
AdRequest adRequest = new AdRequest.Builder().build();
InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712", adRequest, new InterstitialAdLoadCallback() {
#Override
public void onAdLoaded(#NonNull InterstitialAd interstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd;
Log.i(TAG, "onAdLoaded");
}
#Override
public void onAdFailedToLoad(#NonNull LoadAdError loadAdError) {
// Handle the error
Log.i(TAG, loadAdError.getMessage());
mInterstitialAd = null;
}
});
}
}
If you can use hilt this is so simple just copy-paste this code its code work great in my production app
AdmobUtil.kt
#Singleton
class AdmobUtil #Inject constructor(#ApplicationContext private val context: Context) {
companion object {
private const val TEST_INTERSTITIAL_AD_UNIT_ID = "ca-app-pub-3940256099942544/1033173712"
private const val INTERSTITIAL_AD_UNIT_ID = ""
}
private lateinit var interstitialAd: InterstitialAd
init {
MobileAds.initialize(context) {
loadAdmobInterstitialAd()
}
}
private val interstitialAdUnitId = when {
(BuildConfig.DEBUG) -> TEST_INTERSTITIAL_AD_UNIT_ID
else -> INTERSTITIAL_AD_UNIT_ID
}
private fun loadAdmobInterstitialAd() {
interstitialAd = InterstitialAd(context)
interstitialAd.adUnitId = interstitialAdUnitId
interstitialAd.loadAd(AdRequest.Builder().build())
interstitialAd.adListener = object : AdListener() {
override fun onAdClosed() {
super.onAdClosed()
reloadInterstitialAd()
}
override fun onAdFailedToLoad(error: LoadAdError?) {
super.onAdFailedToLoad(error)
}
}
}
fun reloadInterstitialAd() {
if (::interstitialAd.isInitialized) interstitialAd.loadAd(AdRequest.Builder().build())
}
fun showInterstitialAd() {
if (::interstitialAd.isInitialized && interstitialAd.isLoaded) interstitialAd.show()
}
}
MainApplication.kt
#HiltAndroidApp
class MainApplication : Application() {
#Inject
lateinit var admobUtil: AdmobUtil
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
admobUtil.reloadInterstitialAd()
}
}
MainAcitivty.kt
#AndroidEntryPoint
class MainActivity : AppCompatActivity(R.layout.main_activity) {
#Inject
lateinit var admobUtil: AdmobUtil
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
admobUtil.showInterstitialAd()
}
}

Android Admob InterstitialAd Deprecated

After updating com.google.android.gms:play-services-ads to 19.7.0
it says InterstitialAd & RewardedVideoAd & UnifiedNativeAdView deprecated.
can anyone help ?
after a quick search, I found that we need to use
public abstract class InterstitialAd extends Object
instead of
public final class InterstitialAd extends Object
so you need to use:
com.google.android.gms.ads.interstitial.InterstitialAd
instead of:
come.google.android.gms.ads
and this is how we interact with the new package:
public class AdManager
{
private var interstitialAd: InterstitialAd? = null
private var mRewardedVideoAd: RewardedAd? = null
private var currentNativeAd: NativeAd? = null
private var builder: AdLoader.Builder? = null
init {
RequestConfiguration.Builder().setTestDeviceIds(
listOf(
AdRequest.DEVICE_ID_EMULATOR,
"CE88B9A1CB213EEEA19A2F7E54993908"
)
)
}
// Create a full screen content callback.
val fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
super.onAdFailedToShowFullScreenContent(p0)
}
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
interstitialAd = null
mRewardedVideoAd = null
}
}
fun createInterstitialAd(context: Context) {
InterstitialAd.load(
context,
BuildConfig.ADMOB_AD_INTERSTITIAL_UNIT_ID,
request.build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
interstitialAd = ad
interstitialAd?.fullScreenContentCallback = fullScreenContentCallback
}
})
}
}
fun getFullScreenAd(): InterstitialAd? {
return interstitialAd
}
fun getVideoAd(): RewardedAd? {
return mRewardedVideoAd
}
fun loadRewardedVideoAd(context: Context) {
if (!userManager.getCurrentUser().isPremium) {
val request = AdRequest.Builder()
RewardedAd.load(
context,
BuildConfig.ADMOB_AD_VIDEO_UNIT_ID,
AdRequest.Builder().build(),
object : RewardedAdLoadCallback() {
override fun onAdLoaded(ad: RewardedAd) {
super.onAdLoaded(ad)
mRewardedVideoAd = ad;
mRewardedVideoAd?.fullScreenContentCallback = fullScreenContentCallback;
}
override fun onAdFailedToLoad(p0: LoadAdError) {
super.onAdFailedToLoad(p0)
}
})
}
fun loadNativeAd(context: Activity,adFrame:FrameLayout) {
builder = AdLoader.Builder(context, BuildConfig.ADMOB_AD_UNIT_ID_DIALOG_NATIVE)
builder?.forNativeAd { unifiedNativeAd: NativeAd ->
val adView: View =
context.layoutInflater.inflate(R.layout.ad_unified, null)
val ad = adView as NativeAdView
populateUnifiedNativeAdView(unifiedNativeAd, ad)
adFrame.removeAllViews()
adFrame.addView(ad)
}
val adLoader = builder?.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(i: LoadAdError) {
super.onAdFailedToLoad(i)
Log.e("NativeAdFailed", i.toString() + "")
}
})?.build()
val builder = AdManagerAdRequest.Builder()
adLoader?.loadAd(builder.build())
}
}
private fun populateUnifiedNativeAdView(
nativeAd: NativeAd,
adView: NativeAdView
) {
// You must call destroy on old ads when you are done with them,
// otherwise you will have a memory leak.
if (currentNativeAd != null) currentNativeAd?.destroy()
currentNativeAd = nativeAd
// Set the media view.
adView.mediaView = adView.findViewById<View>(R.id.ad_media) as com.google.android.gms.ads.nativead.MediaView
// Set other ad assets.
adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.bodyView = adView.findViewById(R.id.ad_body)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.iconView = adView.findViewById(R.id.ad_app_icon)
adView.priceView = adView.findViewById(R.id.ad_price)
adView.starRatingView = adView.findViewById(R.id.ad_stars)
adView.storeView = adView.findViewById(R.id.ad_store)
adView.advertiserView = adView.findViewById(R.id.ad_advertiser)
// The headline and media content are guaranteed to be in every UnifiedNativeAd.
(adView.headlineView as TextView).text = nativeAd.headline
nativeAd.mediaContent?.let {
adView.mediaView?.setMediaContent(it)
}
// These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
// check before trying to display them.
if (nativeAd.body == null) {
adView.bodyView?.visibility = View.INVISIBLE
} else {
adView.bodyView?.visibility = View.VISIBLE
(adView.bodyView as TextView).text = nativeAd.body
}
if (nativeAd.callToAction == null) {
adView.callToActionView?.visibility = View.INVISIBLE
} else {
adView.callToActionView?.visibility = View.VISIBLE
(adView.callToActionView as TextView).text = nativeAd.callToAction
}
if (nativeAd.icon == null) {
adView.iconView?.visibility = View.GONE
} else {
(adView.iconView as ImageView).setImageDrawable(
nativeAd.icon?.drawable
)
adView.iconView?.visibility = View.VISIBLE
}
if (nativeAd.price == null) {
adView.priceView?.visibility = View.INVISIBLE
} else {
adView.priceView?.visibility = View.VISIBLE
(adView.priceView as TextView).text = nativeAd.price
}
if (nativeAd.store == null) {
adView.storeView?.visibility = View.INVISIBLE
} else {
adView.storeView?.visibility = View.VISIBLE
(adView.storeView as TextView).text = nativeAd.store
}
if (nativeAd.starRating == null) {
adView.starRatingView?.visibility = View.INVISIBLE
} else {
nativeAd.starRating?.toDouble()?.let {
(adView.starRatingView as RatingBar).rating = it.toFloat()
adView.starRatingView?.visibility = View.VISIBLE
}
}
if (nativeAd.advertiser == null) {
adView.advertiserView?.visibility = View.INVISIBLE
} else {
(adView.advertiserView as TextView).text = nativeAd.advertiser
adView.advertiserView?.visibility = View.VISIBLE
}
// This method tells the Google Mobile Ads SDK that you have finished populating your
// native ad view with this native ad.
adView.setNativeAd(nativeAd)
}
}
There are many breaking changes coming in version 20.0.0. Version
19.7.0 introduced many new APIs, and deprecated or renamed many classes in preparation for version 20.0.0.
This code explains how to integrate interstitial ads in v 19.7.0
class Web : AppCompatActivity() {
private var mInterstitialAd: InterstitialAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_web)
// load ad
loadAd();
toNextLevel()
}
// load ad
private fun loadAd() {
InterstitialAd.load(
this#Web,
"ca-app-pub-3940256099942544/1033173712",
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(interstitialAd: InterstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd
mInterstitialAd?.fullScreenContentCallback =
object : FullScreenContentCallback() {
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
mInterstitialAd = null
//// perform your code that you wants to do after ad dismissed or closed
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
mInterstitialAd = null
/// perform your action here when ad will not load
}
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
this#Web.mInterstitialAd = null
}
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
// Handle the error
mInterstitialAd = null
}
})
}
private fun toNextLevel() {
// Show the interstitial if it is ready. Otherwise, proceed to the next level
// without ever showing it
if (mInterstitialAd != null) {
mInterstitialAd?.show(this#Web)
} else {
nextLevel()
// in case you want to load a new ad
requestNewInterstitial()
}
}
private fun nextLevel() {
TODO("Not yet implemented")
}
private fun requestNewInterstitial() {
if (mInterstitialAd == null) {
loadAd()
}
}
}
use com.google.android.gms.ads.interstitial.InterstitialAd
instead of
come.google.android.gms.ads
when you upgrade the admob sdk to
implementation 'com.google.firebase:firebase-ads:19.7.0'
you will found the old sdk method deprecated like InterstitialAD
Its Simple here just follow my way to load your interstitial and remove deprecation here its my sample code for better ad request load your add in the On start in your activity if you have any query kindly let me know below in comments copy paste the below code:
public static AdRequest adRequest;
public static InterstitialAd mInterstitialAd;
public void InterstitialAdmob() {
InterstitialAd.load(MainActivity.this,getString(R.string.Interstitial), adRequest, new InterstitialAdLoadCallback() {
#Override
public void onAdLoaded(#NonNull InterstitialAd interstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd;
mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){
#Override
public void onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent();
mInterstitialAd=null;
//// perform your code that you wants todo after ad dismissed or closed
}
#Override
public void onAdFailedToShowFullScreenContent(com.google.android.gms.ads.AdError adError) {
super.onAdFailedToShowFullScreenContent(adError);
mInterstitialAd = null;
/// perform your action here when ad will not load
}
#Override
public void onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent();
mInterstitialAd = null;
}
});
}
#Override
public void onAdFailedToLoad(#NonNull LoadAdError loadAdError) {
// Handle the error
mInterstitialAd = null;
}
});
}
#Override
protected void onStart() {
super.onStart();
measyrating.onStart();
adRequest = new AdRequest.Builder().build();
InterstitialAdmob();
}
Now show your ads simply on backpressed or button click
#Override
public void onBackPressed() {
if (mInterstitialAd!=null){
mInterstitialAd.show(MainActivity.this);
}
else{
if (doubleBackToExitPressedOnce) {
if (mBottomNavigationView.getSelectedItemId() == R.id.navigation_doc)
{
super.onBackPressed();
}
else
{
mBottomNavigationView.setSelectedItemId(R.id.navigation_doc);
}
return;
}
this.doubleBackToExitPressedOnce = true;
if (this.drawer.isDrawerOpen(GravityCompat.START)) {
this.drawer.closeDrawer(GravityCompat.START);
}
if (itempositionselected==0){
loadFragment(new DocxFileFragment());
}
else {
}
if (!searchView.isIconified()) {
searchView.setIconified(true);
}
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
}
Google Mobile Ads SDK version 20.0.0 is planned for early 2021 and comes with a few major changes, as well as several straightforward API renames and removal of deprecated APIs.
You can check more details on this link.
Use NativeAdView instead of UnifiedNativeAdView and so on.
Following page has example and details for newer version of interstitial ad
https://developers.google.com/admob/android/interstitial
Below is a full working example based on above i am using with current versioncom.google.android.gms:play-services-ads:20.2.0:
public class BriefDisplayActivity extends AppCompatActivity {
InterstitialAd briefInterstitialAd;
AdRequest adRequest_I = new AdRequest.Builder().build();
InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712", adRequest_I,
new InterstitialAdLoadCallback() {
#Override
public void onAdLoaded(#NonNull InterstitialAd interstitialAd) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
BriefDisplayActivity.this.briefInterstitialAd = interstitialAd;
Log.i(TAG, "onAdLoaded");
briefInterstitialAd.show(BriefDisplayActivity.this);
}
#Override
public void onAdFailedToLoad(#NonNull LoadAdError loadAdError) {
// Handle the error
Log.i(TAG, loadAdError.getMessage());
BriefDisplayActivity.this.briefInterstitialAd = null;
}
});
}

Getting my location LatLng from Mapbox in kotlin

I'm trying to get my location using mapbox on an android application built with kotlin. I'm using the locationComponent method to get it, here is my code :
class PlaceholderFragment : Fragment(), OnMapReadyCallback, PermissionsListener {
private var permissionsManager: PermissionsManager = PermissionsManager(this)
private var mapboxMap: MapboxMap? = null
private var myCurrentLocation: LatLng? = null
var navigationMapRoute: NavigationMapRoute? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
pageViewModel = ViewModelProviders.of(this).get(PageViewModel::class.java).apply {
setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
}
val theActivity = activity as NavigationActivity?
theSteps = theActivity?.theSteps
case = theActivity?.case
case = theActivity.case
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
activity?.let {
Mapbox.getInstance(
it,
getString(com.innoventiq.arkbeh.R.string.mapbox_access_token2)
)
}
val root =
inflater.inflate(com.innoventiq.arkbeh.R.layout.fragment_navigation, container, false)
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mapView.onCreate(savedInstanceState)
mapView.getMapAsync(this)
getMyLocation()
}
override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) {
Toast.makeText(
activity,
com.innoventiq.arkbeh.R.string.user_location_permission_explanation,
Toast.LENGTH_LONG
)
.show()
}
override fun onPermissionResult(granted: Boolean) {
if (granted) {
enableLocationComponent(mapboxMap?.style!!)
} else {
Toast.makeText(
activity,
com.innoventiq.arkbeh.R.string.user_location_permission_not_granted,
Toast.LENGTH_LONG
)
.show()
}
}
override fun onMapReady(mapboxMap: MapboxMap) {
this.mapboxMap = mapboxMap
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(myCurrentLocation)
.zoom(14.0)
.build()
//mapView.setOnTouchListener { v, event -> true }
mapboxMap.setStyle(Style.OUTDOORS) {
enableLocationComponent(it)
}
}
#SuppressLint("MissingPermission")
private fun enableLocationComponent(loadedMapStyle: Style) {
// Check if permissions are enabled and if not request
if (PermissionsManager.areLocationPermissionsGranted(activity)) {
// Create and customize the LocationComponent's options
val customLocationComponentOptions = activity?.let {
LocationComponentOptions.builder(it)
.trackingGesturesManagement(true)
.accuracyColor(
ContextCompat.getColor(
activity!!,
com.innoventiq.arkbeh.R.color.colorGreen
)
)
.build()
}
val locationComponentActivationOptions =
activity?.let {
LocationComponentActivationOptions.builder(it, loadedMapStyle)
.locationComponentOptions(customLocationComponentOptions)
.build()
}
// Get an instance of the LocationComponent and then adjust its settings
mapboxMap?.locationComponent?.apply {
// Activate the LocationComponent with options
locationComponentActivationOptions?.let {
this?.activateLocationComponent(
it
)
}
// Enable to make the LocationComponent visible
isLocationComponentEnabled = true
// Set the LocationComponent's camera mode
cameraMode = CameraMode.TRACKING
// Set the LocationComponent's render mode
renderMode = RenderMode.COMPASS
}
} else {
permissionsManager = PermissionsManager(this)
permissionsManager.requestLocationPermissions(activity)
}
}
private fun getMyLocation() {
myCurrentLocation =
mapboxMap?.locationComponent?.lastKnownLocation?.latitude?.let {
mapboxMap!!.locationComponent.lastKnownLocation?.longitude?.let { it1 ->
LatLng(it,
it1
)
}
}
println("the location : $myCurrentLocation ")
}
override fun onStart() {
super.onStart()
mapView.onStart()
}
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onStop() {
super.onStop()
mapView.onStop()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
}
companion object {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private const val ARG_SECTION_NUMBER = "section_number"
/**
* Returns a new instance of this fragment for the given section
* number.
*/
#JvmStatic
fun newInstance(sectionNumber: Int): PlaceholderFragment {
return PlaceholderFragment().apply {
arguments = Bundle().apply {
putInt(ARG_SECTION_NUMBER, sectionNumber)
}
}
}
}
}
I used almost the full fragment code just trying to give you a clear view of the steps I've used to get the location. When it comes to the line println("the location : $myCurrentLocation ")
inside the getMyLocation() function , it returns this output the location : null ,, any help on this ?
Note
When the map loads, it shows my location perfectly and tracks it, but I just can't get the LatLng of it.
I've found the answer, used LocationComponent.LocationEngine.getLastLocation callBack to get it , here is the code:
private fun getMyLocation() {
mapboxMap?.locationComponent?.locationEngine?.getLastLocation(object :
LocationEngineCallback<LocationEngineResult> {
override fun onSuccess(result: LocationEngineResult?) {
if (result != null) {
myCurrentLocation =
LatLng(result.locations[0].latitude, result.locations[0].longitude)
println("my location is : $myCurrentLocation")
getTheRoute(myCurrentLocation)
}
}
override fun onFailure(exception: Exception) {
toast(getString(R.string.failed_get_location))
}
})
}

Android Kotlin - Create dialog inside a callback function

I'm trying to create a dialog inside a callback onSuccess() which again is inside the onCreate() method of the activity, but the dialog view doesn't show up.
When I call createDialog() directly inside the onCreate() it works. What could be the reason why it's not working in the onSuccess() callback function? onSuccess() and createDialog() definitely get called because the println show up.
Code:
class BleDevicesControlActivity : AppCompatActivity() {
private var device: BluetoothDevice? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ble_devices_control)
connectToDevice(object : BleCommunication.OnConnectionListener {
override fun onSuccess() {
println("onSuccess called")
createDialog()
}
override fun onFailure() {
println("onFailure called")
}
})
}
private fun connectToDevice(onConnectionListener : BleCommunication.OnConnectionListener) {
bleCommunication.connect(device!!, onConnectionListener)
}
private fun createDialog() {
println("createDialog called")
val dialogInflater = LayoutInflater.from(this)
val alertDialogView = dialogInflater.inflate(R.layout.dialog_alert, null)
val alertDialog = AlertDialog.Builder(this).create()
alertDialog.setView(alertDialogView)
alertDialog.show()
}
}
Try this
override fun onSuccess() {
println("onSuccess called")
runOnUiThread { createDialog() }
}
Set view to dialog builder:
private fun createDialog() {
println("createDialog called")
val dialogInflater = LayoutInflater.from(this)
val alertDialogView = dialogInflater.inflate(R.layout.dialog_alert, null)
val alertDialog = AlertDialog.Builder(this).setView(alertDialogView).create()
alertDialog.show()
}

Categories

Resources