如何修复Android AdMob“无法获取JavascroptEngine”错误?

问题描述

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中,但是问题没有得到解决错误内容如下。

enter image description here

解决方法

我遇到了同样的问题,我只是通过更换设备来解决它。详细信息:我为原生 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,我花了一些时间才最终弄明白。