问题描述
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
MobileAds.initialize(this) {}
MobileAds.setRequestConfiguration(
RequestConfiguration.Builder()
.setTestdeviceids(listof("ABCDEF012345"))
.build()
)
val adRequest = AdRequest.Builder().build()
Log.d("Activity","Is Test Device? : ${adRequest.isTestDevice(this)}")
adView.loadAd(adRequest)
adView.adListener = object : AdListener() {
override fun onAdLoaded() {
super.onAdLoaded()
Log.d("Activity","@@ onAdLoaded()")
}
override fun onAdFailedToLoad(err: LoadAdError?) {
super.onAdFailedToLoad(err)
Log.d("Activity","@@ onAdFailedToLoad()\n$err")
}
override fun onAdOpened() {
super.onAdOpened()
Log.d("Activity","@@ onAdOpened()")
}
override fun onAdClicked() {
super.onAdClicked()
Log.d("Activity","@@ onAdClicked()")
}
override fun onAdLeftApplication() {
super.onAdLeftApplication()
Log.d("Activity","@@ onAdLeftApplication()")
}
override fun onAdClosed() {
super.onAdClosed()
Log.d("Activity","@@ onAdClosed()")
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
ads:adSize="BANNER"
ads:adUnitId="@string/banner_ad_unit_id_for_test" />
</LinearLayout>
string.xml
<resources>
<string name="admob_app_id">ca-app-pub-000000000000~00000000000</string>
<string name="bannera_ad_unit_id_for_test">ca-app-pub-3940256099942544/6300978111</string>
</resources>
我在清单中创建了<Meta-dat>
,并在其中添加了admob_app_id
作为android:value
的值。在Android Studio提供的AVD测试设备中,出现了测试广告,没有任何问题,但测试广告没有出现在实际设备上。因此,就像上面的MainActivity
代码一样,我调用了RequestConfiguration
并将我的移动设备ID("ABCDEF012345"
)添加到了测试设备ID中,但是问题没有得到解决。错误的内容如下。
解决方法
我遇到了同样的问题,我只是通过更换设备来解决它。详细信息:我为原生 android 集成了 google admob 和中介。根据谷歌教程,在为 samsung s7 构建时,我遇到了“无法获得 JavascroptEngine”的问题。之后我找到了解决该问题的方法,但没有任何改变。我尝试使用另一台设备(shark 1)并加载了广告. 如果您遇到同样的问题,请尝试使用其他设备。
,使用原生广告时,我在Android上遇到类似的问题。错误信息非常相似:
code:0 message:Unable to obtain a JavascriptEngine. domain:com.google.android.gms.ads cause:null responseInfo:{
"Response ID": "null","Mediation Adapter Class Name": "","Adapter Responses": []
}
但是,我有一个线索可能是这样的:正如我注意到有时在应用程序上发生奇怪的崩溃一样,我决定通过检查其签名来添加一项检查,以确认该应用程序确实有效
我发现在这种情况下,至少有2台设备更改了应用程序(可能是同一个人)。因此,该用户出于某种原因尝试更改应用程序。不知道他试图做什么,但是我希望这可以解决您的问题。
如果需要,这是一种基本的实现方式:
private var sIsValidInstall: Boolean? = null
private const val BYTE_SIZE_FOR_DEBUG_SIGNATURE=...
private const val CRC_FOR_DEBUG_SIGNATURE=...
private const val BYTE_SIZE_FOR_DEBUG_SIGNATURE=...
private const val CRC_FOR_DEBUG_SIGNATURE=...
@SuppressLint("PackageManagerGetSignatures")
fun isValidInstall(context: Context): Boolean {
sIsValidInstall?.let { return it }
var isValid = false
val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
context.packageManager.getPackageInfo(context.packageName,PackageManager.GET_SIGNING_CERTIFICATES).signingInfo.apkContentsSigners
else context.packageManager.getPackageInfo(context.packageName,PackageManager.GET_SIGNATURES).signatures
for (signature in signatures) {
val bytes = signature.toByteArray()
if (bytes != null) {
val bytesSize = bytes.size
val checksum = CRC32()
checksum.update(bytes,bytes.size)
val crc = checksum.value
isValid = (BuildConfig.DEBUG && bytesSize == BYTE_SIZE_FOR_DEBUG_SIGNATURE && crc == CRC_FOR_DEBUG_SIGNATURE) || (!BuildConfig.DEBUG && bytesSize == BYTE_SIZE_FOR_DEBUG_SIGNATURE && crc == CRC_FOR_DEBUG_SIGNATURE)
if (isValid)
break
}
}
sIsValidInstall = isValid
return isValid
}
,
大多数时候 AdMob 在模拟器上的表现不如预期,因为上面没有类似 Play 商店服务这样的东西。在真实设备上尝试。有时在模拟器上冷启动可以解决问题。
,可能不是每个人的解决方案,但为我修复了它:不要忘记关闭各种广告拦截器。
我配置了一个广告拦截器 DNS,我花了一些时间才最终弄明白。