gpt4 book ai didi

Android WebView 在 WebViewDelegate.getPackageId 处导致 RuntimeException

转载 作者:太空狗 更新时间:2023-10-29 14:35:43 25 4
gpt4 key购买 nike

我在 MainActivity 的布局 xml 中有一个 WebView,我将 setWebViewClient(new WebViewClient()),然后是 loadUrl(...) 在 onCreate .

大多数情况下,应用程序运行良好,Web 内容也能正确显示。

但在某些情况下,打开应用程序会导致崩溃。我注意到当应用程序使用 AlarmManager 安排 PendingIntent 广播时会发生这种情况,这会触发一个通知,其 contentIntent 是一个 PendingIntent.getActivity 设置为启动 MainActivity。但这仅发生在用户同时从 Activity 应用程序堆栈中删除应用程序的情况下(通知可见,尚未单击,如果应用程序已清除则堆栈。那么,应用程序进程可能已停止?)。

两者之间似乎没有其他系统修改(特别是没有应用程序/系统更新,没有玩弄用户配置文件或 Chrome 应用程序。)

堆栈跟踪:

java.lang.RuntimeException: 
at android.webkit.WebViewDelegate.getPackageId (WebViewDelegate.java:164)
at yj.a (PG:16)
at xH.run (PG:14)
at java.lang.Thread.run (Thread.java:764)

发生在 Android 7.0 到 9 之间。此外,当我将目标 SDK 升级到 28 时似乎已经开始发生。

我没有明确使用 WebViewDelegate。它必须是内部系统代码(因此混淆)。

看了AOSP的源码,好像是WebView无法获取到它所属的package——但为什么有时只能获取!?

感谢任何帮助!谢谢。

最佳答案

断断续续调查了数周,但我终于找到了为什么我会看到这个问题。对我来说,这只是因为我在我的应用程序范围内覆盖了 getResources() 方法以使用当前 Activity 。像这样:

public class MyApplication extends MultiDexApplication {
private static MyApplication sInstance = null;
private WeakReference<Activity> mCurrentActivity;

public static MyApplication getInstance() {
return sInstance;
}

public void setCurrentActivity(Activity activity) {
mCurrentActivity = new WeakReference<>(activity);
}

public Activity getCurrentActivity() {
return mCurrentActivity == null ? null : mCurrentActivity.get();
}

@Override
public Resources getResources() {
// This is a very BAD thing to do
Activity activity = getCurrentActivity();
if (activity != null) {
return activity.getResources();
}
return super.getResources();
}
}

这是作为一种快捷方式完成的,因为我经常想要获取特定于 Activity 的字符串,所以我调用了 MyApplication.getInstance().getResources().getString()。我现在知道这是一件坏事 - 删除我对此方法的重写会立即修复它。

所以对我来说,从中得出的关键结论是,当 WebView 初始化时,它必须能够掌握应用程序上下文,以便传递到 WebViewDelegate.getPackageId() 的资源处于应用程序级别 - Activity 上下文不够,导致此错误。

作为旁注 - 我什至没有尝试将 WebView 添加到我的应用程序中。我实际上只使用了以下内容:

String userAgent = WebSettings.getDefaultUserAgent(this);

然后我将这个值传递到我正在使用的自定义媒体播放器中。由于我的覆盖,将“this”作为应用程序或 Activity 范围传递总是失败。

关于Android WebView 在 WebViewDelegate.getPackageId 处导致 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56496714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com