WebView init 得到异常:无法创建锁定文件 webview_data.lock EACCES(权限被拒绝)

时间:2021-01-21 05:03:38

标签: android webview storage filenotfoundexception

我在 chromim80 上的三星 Android 10 手机上遇到了这个异常。其他设备似乎没问题。

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.RuntimeException: Failed to create lock file /data/user/0/my_package/app_webview/webview_data.lock
 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3448)     
 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)     
 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)     
 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)     
 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)     
 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)     
 android.os.Handler.dispatchMessage(Handler.java:107)     
 android.os.Looper.loop(Looper.java:237)     
 android.app.ActivityThread.main(ActivityThread.java:7814)     
 java.lang.reflect.Method.invoke(Native Method:0)     
 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)     
 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)     

Caused by: java.lang.RuntimeException: Failed to create lock file /data/user/0/my_package/app_webview/webview_data.lock     
 org.chromium.android_webview.AwDataDirLock.b(chromium-TrichromeWebViewGoogle.aab-stable-428014130:31)     
 Mj.i(chromium-TrichromeWebViewGoogle.aab-stable-428014130:31)     
 Mj.b(chromium-TrichromeWebViewGoogle.aab-stable-428014130:16)     
 Mj.k(chromium-TrichromeWebViewGoogle.aab-stable-428014130:2)     
 com.android.webview.chromium.WebViewChromiumFactoryProvider.g(chromium-TrichromeWebViewGoogle.aab-stable-428014130:2)     
 com.android.webview.chromium.WebViewChromium.init(chromium-TrichromeWebViewGoogle.aab-stable-428014130:14)     
 android.webkit.WebView.<init>(WebView.java:429)     
 android.webkit.WebView.<init>(WebView.java:353)     
 android.webkit.WebView.<init>(WebView.java:336)     
 android.webkit.WebView.<init>(WebView.java:323)     
 android.webkit.WebView.<init>(WebView.java:313)     

我的 targetSDK 是 29,我添加了 android:requestLegacyExternalStorage="true"WebView.setDataDirectorySuffix(processName);

有人知道怎么解决这个问题吗?

更新:

我发现了这个,所以我认为这是原因。它只发生在 chromim80 上。

https://chromium-review.googlesource.com/c/chromium/src/+/2153785/3/android_webview/java/src/org/chromium/android_webview/AwDataDirLock.java#70

目前看来我只能在主进程上使用 webview。

1 个答案:

答案 0 :(得分:0)

Android 9 禁止在多个进程之间共享 Web 视图数据目录。如果一个 web 视图已经在使用它,那么它将无法访问它。相反,你可以试试这个

 public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        String processName = getProcessName(this);
        String packageName = this.getPackageName();
        if (!packageName.equals(processName)) {
            WebView.setDataDirectorySuffix(processName);
        }
    }}

private String getProcessName(Context context) {
    if (context == null) return null;
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
        if (processInfo.pid == android.os.Process.myPid()) {
            return processInfo.processName;
        }
    }
    return null;
}