После успешной инициализации рекламы в Admob.
Но когда я пытаюсь показать это межстраничное объявление, я получаю сообщение об ошибке:
onAdFailedToShowFullScreenContent {
"Code": 0,
"Message": "Timeout for show call succeed.",
"Domain": "com.google.android.gms.ads",
"Cause": "null"
}
Проект — отдельное действие с графиком навигации. Также используйте Koin.
Версия Admob "com.google.android.gms:play-services-ads:23.5.0"
Баннер отображается правильно.
Что было сделано:
- Ключ AdMob аккаунта был вставлен в образец приложения Google с тестовым ключом Inter. Результат: Интер показывает
- Был создан новый проект с навигатором и одним действием, и в него был вставлен мой AdmobManager с ключами. Результат: Интер показывает
- Перенос файлов из старого проекта в новый. Результат: «Интер» не был показан с надписью «Тайм-аут для успешного вызова шоу». ошибка
Из этого я понимаю, что ключи и учетная запись верны. Также мой AdmobManager работает для чистого проекта. - При отладке я вижу, что шоу вызывается из основного потока.
- Активность для показа в реальном времени, без паузы или остановки< /li>
Inrestitial объект не нулевой, содержит данные - Попытка добавить тайм-аут после загрузки объявления перед его показом не помогает
< li>Добавить в Koin как модуль не помогает
Данные перед вызовом inter show: Activity com.example.x.MainActivity@c05dd82 interAd adUnitId ca-app-pub-3940256099942544/1033173712 interAd com.google.android.gms.internal.ads.zzbml@8817dd0
Данные после вызова inter show: После показа активности com.example.x.MainActivity@c05dd82 interAd adUnitId ca-app-pub-3940256099942544/1033173712 interAd com.google.android.gms.internal.ads.zzbml@8817dd0
Жизненный круг деятельности:
before calling inter show:
onStart
onResume
After show activity com.example.x.MainActivity@c05dd82 interAd adUnitId ca-app-pub-3940256099942544/1033173712 interAd com.google.android.gms.internal.ads.zzbml@8817dd0
onPause
onAdFailedToShowFullScreenContent {
"Code": 0,
"Message": "Timeout for show call succeed.",
"Domain": "com.google.android.gms.ads",
"Cause": "null"
}
onResume
Мой код:
object AdmobManager {
private var interAd: InterstitialAd? = null
private var loadedAdNumber = 0
private var failedCount = 0
fun init(context: Context) {
MobileAds.initialize(context){}
MobileAds.setRequestConfiguration(
RequestConfiguration.Builder()
.setTestDeviceIds(listOf("xxxxxxxx")).build()
)
}
fun preloadAd(context: Context, adsDelegateShow: AdsDelegateLoad) {
InterstitialAd.load(
context,
"ca-app-pub-3940256099942544/1033173712",
AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(interstitialAd: InterstitialAd) {
super.onAdLoaded(interstitialAd)
Log.i("AdsWrapper", "onAdLoaded")
failedCount = 0
interAd = interstitialAd
adsDelegateShow.onAdsLoaded()
}
override fun onAdFailedToLoad(p0: LoadAdError) {
super.onAdFailedToLoad(p0)
Log.i("AdsWrapper", "onAdFailedToLoad " + p0.toString())
adsDelegateShow.onAdsLoaded()
if(failedCount < 15){
interAd = null
failedCount++
preloadAd(context){}
}
}
})
}
fun showInterstitial(activity: Activity, adsDelegateShow: AdsDelegateShow) {
Log.i("AdsWrapper", "showInterstitial")
if (interAd == null) {
adsDelegateShow.onAdsClosed()
Toast.makeText(activity.applicationContext, "Load waiting", Toast.LENGTH_LONG).show()
return
}
Log.i("AdsWrapper", "activity " + activity.toString() + " interAd adUnitId " + interAd!!.adUnitId +" interAd " + interAd)
interAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
adsDelegateShow.onAdsOpened()
Log.i("AdsWrapper", "onAdShowedFullScreenContent ")
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
Log.i("AdsWrapper", "onAdDismissedFullScreenContent ")
interAd = null
preloadAd(activity.applicationContext)
adsDelegateShow.onAdsClosed()
}
override fun onAdFailedToShowFullScreenContent(p0: AdError) {
super.onAdFailedToShowFullScreenContent(p0)
Log.i("AdsWrapper", "onAdFailedToShowFullScreenContent " + p0)
interAd = null
Toast.makeText(activity.applicationContext, p0.toString(), Toast.LENGTH_LONG).show()
preloadAd(activity.applicationContext)
adsDelegateShow.onAdsClosed()
}
}
interAd!!.show(activity)
Log.i("AdsWrapper", "After show activity " + activity.toString() + " interAd adUnitId " + interAd!!.adUnitId +" interAd " + interAd)
}
interface AdsDelegateShow {
fun onAdsClosed()
fun onAdsOpened() {}
}
interface AdsDelegateLoad{
fun onAdsLoaded() {}
}
}
Применение:
class App : Application() {
companion object {
lateinit var instance: App
}
override fun onCreate() {
super.onCreate()
instance = this
startKoin {
androidContext(this@App)
modules(
listOf(
viewModelModule
)
)
}
AppCompatDelegate.setDefaultNightMode(
AppCompatDelegate.MODE_NIGHT_NO
)
AdmobManager.init(this)
FirebaseApp.initializeApp(this)
FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(true)
FirebaseAnalytics.getInstance(this).logEvent("open_app", bundleOf())
val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 0
}
remoteConfig.setConfigSettingsAsync(configSettings)
remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
}
}
Моя активность:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
Макет моих действий:
Мой фрагмент
class SplashFragment : Fragment() {
private var _binding: FragmentSplashBinding? = null
private val binding get() = _binding!!
private var progressStatus = 0
private var answerAdsLoadGet = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
_binding = FragmentSplashBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
AdmobManager.preloadAd(requireActivity(),
object : AdmobManager.AdsDelegateLoad {
override fun onAdsLoaded() {
Log.d("AdsWrapper", "answer got")
answerAdsLoadGet = true
}
})
binding.progressBar.progress = 0
binding.progressBar.progressDrawable.mutate()
requestNotificationPermission()
getInstalledApps()
lifecycleScope.launch {
while (progressStatus < PROGRESS_BAR_MAX) {
if(answerAdsLoadGet && progressStatus < 99){
progressStatus += 2
} else {
progressStatus += 1
}
withContext(Dispatchers.Main) {
binding.progressBar.progress = progressStatus
val loadingPercent = getString(R.string.storage_percent_info, progressStatus)
binding.progressText.text = loadingPercent
}
delay(SPLASH_TIME_OUT)
}
withContext(Dispatchers.Main) {
AdmobManager.showInterstitial(requireActivity(), object : AdmobManager.AdsDelegateShow {
override fun onAdsClosed() {
findNavController().navigate(R.id.action_splashFragment_to_mainFragment)
}
})
}
}
}
//какой-то другой код
companion object {
const val SPLASH_TIME_OUT = 60L
const val PROGRESS_BAR_MAX = 100
const val REQUEST_NOTIFICATION_PERMISSION = 1001
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Мой манифест
Подробнее здесь: https://stackoverflow.com/questions/792 ... llscreenco