如何修复Android AdMob的“无法获取Javascript引擎”错误?

15

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

这里输入图片描述


请检查错误代码,它必须是此处提到的错误代码:0(内部错误)。https://support.google.com/admob/thread/3494603?hl=en - Himanshu Malik
8个回答

22

可能不是适用于每个人的解决方案,但对我来说很有效: 别忘了关闭所有类型的广告拦截器

我配置了一个广告拦截器DNS,花费了我一些时间才最终找出来。


2
这是正确的答案,我在我的已root设备上安装了广告拦截器(lucky patcher),遇到了同样的错误。当我重新启用广告拦截器上的广告时,错误就不再出现了。 - yazan sayed
1
此外,如果你像我一样使用了 Pi-hole,也会出现这种情况。这个答案帮了我很多。 - ads
当您在设备连接上使用手动代理时,也会出现这种情况。 - Ali Tamoor

3
大多数情况下,模拟器上的AdMob表现不如预期,因为它上面没有类似于Play商店服务的东西。请在真实设备上尝试。有时,在模拟器上进行冷启动可以解决问题。
  1. 访问AdMob政策中心以查看任何待处理的违规行为。
  2. 不要使用VPN,根本不要使用代理。
  3. 确保在调试过程中使用测试广告单元ID。
  4. 在模拟器上进行冷启动
  5. 使用真实设备而不是模拟器。

1
不要使用代理,这真是救了我的一天,非常感谢! - ZhouX

1
我之前在WIFI上使用手动代理,忘记更改了,结果出现了一个奇怪的问题:Unable to obtain a JavascriptEngineonAdFailedToLoad 中。只需通过长按已连接的WIFI,在高级选项中将WIFI网络更改为代理>无,即可解决该问题。请注意保留HTML标签。

0

将以下行添加到proguard规则文件中

-keep class com.google.android.gms.ads.** { *; }
-keep class com.google.ads.** { *; }

还可以阅读关于 Proguard 和 AdMob 的内容

Proguard 和 AdMob 中介


0
在我的情况下,设备的Wi-Fi已经打开但是没有互联网连接,一旦我解决了互联网问题,广告就开始加载了。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

对于俄罗斯,由于AdMob现在被Google封锁了,你需要开启VPN。


-2
我在使用原生广告时,在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": []
}

但是,我有一个线索可能是这个问题的原因:由于我注意到应用程序有时会出现奇怪的崩溃,我决定添加一个检查,确保应用程序看起来有效,通过检查它的签名。

我发现的是,在这种情况下,至少有两个设备的应用程序被更改了(可能是同一个人)。所以这个用户出于某种原因尝试更改了应用程序。不知道他试图做什么,但我希望这可以解决你的问题。

如果你想,这里有一种基本的方法来做:

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 developer
我在使用调试版本时确实遇到了这个问题。该应用程序依赖于React Native,并通过本地桥接访问Admob。这可能会产生影响。 - gbero
@gbero 你能重现这个问题吗?如果可以,请向Google/Admob报告。 - android developer
@gbero 还要检查设备的时间设置是否正确。 - android developer

-4

我遇到了同样的问题,但只是通过更换设备来解决。具体来说,我在本地Android应用程序中集成了Google AdMob和Mediation。根据Google的教程,在构建三星S7时,我遇到了“无法获取JavascroptEngine”的问题。之后我找到了一种解决方法,但没有任何改变。我尝试使用另一个设备(鲨鱼1),广告成功加载。如果你遇到了同样的问题,请尝试使用另一个设备。


1
这是否意味着广告永远不会在三星S7上显示?还是有时会显示,而其他时候会出现此错误? - صلي علي محمد - Atef Farouk
1
这不能被接受为答案,因为它无法解决问题。你如何为所有用户“更改设备”? - Leo DroidCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接