如何修复 Android AdMob "Unable to obtain a JavascriptEngine" 错误?

How to fix the Android AdMob "Unable to obtain a JavascriptEngine" error?

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 值。在AndroidStudio提供的AVD测试设备中,出现了一个测试广告,没有任何问题,但是在实际设备上却没有出现测试广告。所以,和上面的MainActivity代码一样,我调用了RequestConfiguration并将我的移动设备ID("ABCDEF012345")添加到测试设备ID中,但问题并没有解决。报错内容如下

我在 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, 0, 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
}

我遇到了同样的问题,我只是通过更换设备解决了它。详细信息:我为原生 android 集成了 google admob 和中介。基于 google 教程,在为三星 s7 构建时,我遇到了“无法获取 JavascroptEngine”的问题。之后我找到了解决该问题的方法,但没有任何改变。我尝试使用另一个设备 (shark 1)并加载了广告。如果您遇到同样的问题,请尝试使用其他设备。

可能不是每个人的解决方案,但对我来说是固定的:不要忘记关闭各种广告拦截器

我配置了一个广告拦截器 DNS,我花了一些时间才最终弄明白。

大多数时候 AdMob 在模拟器上的表现不尽如人意,因为上面没有像 Play 商店服务这样的东西。在真实设备上尝试。有时在模拟器上冷启动可以解决问题。

我正在为 WIFI 使用手动代理,广告忘了更改,我发生的这件奇怪的事情是 Unable to obtain a JavascriptEngineonAdFailedToLoad,只是通过将 WIFI 网络修改为代理来解决>NONE 在已连接的 WIFI 上长按“高级”选项