如何修复 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 JavascriptEngine
在 onAdFailedToLoad
,只是通过将 WIFI 网络修改为代理来解决>NONE 在已连接的 WIFI 上长按“高级”选项
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 JavascriptEngine
在 onAdFailedToLoad
,只是通过将 WIFI 网络修改为代理来解决>NONE 在已连接的 WIFI 上长按“高级”选项