安卓webView中的ERR_ACCESS_DENIED错误

34
我已经为Android Studio创建了一个WebView应用程序,但无法加载Web URL,出现了net::ERR_ACCESS_DENIED错误。有人可以帮忙解决吗?

3
奇怪,我遇到了同样的问题,但只在Android 10上出现,Android 9及以下版本则没问题 :\ - lelloman
@lelloman 我也遇到了这个问题,只有在尝试从Webview上传文件到S3时才会出现,而且只在Android 10上出现。你找到任何解决方案了吗? - tophernuts
1
@tophernuts 是的,最后可能是因为它记得之前没有获得许可而导致的。我刚刚取消了我的回答删除,你可以在下面找到它。 - lelloman
@lelloman,我无法在这里看到你的答案,不确定是否是奇怪的stackoverflow问题? - tophernuts
5
@tophernuts 不知道,无论如何都是这样的:对我来说问题有点傻,最初我忘记在清单文件中添加android:usesCleartextTraffic="true",然后启动了应用程序。之后我添加了android:usesCleartextTraffic="true",但仍然显示ERR_ACCESS_DENIED。然后我清除了数据,卸载了该应用程序,重新安装它,然后问题就解决了。 - lelloman
显示剩余5条评论
11个回答

40

对我来说这个问题有点儿傻,我最初在启动应用程序时忘记在清单中添加 android:usesCleartextTraffic="true"。在我添加了 android:usesCleartextTraffic="true" 之后,它仍然给出了 ERR_ACCESS_DENIED。然后我清除了数据,卸载了应用程序,重新安装,问题就解决了。


https://dev59.com/DnA75IYBdhLWcg3w_ej1 - MartianMartian

23
尝试将以下内容添加到您的 webview 代码中:
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
如果仍然无法正常工作,请尝试在您的清单文件中的应用程序标记中添加android:usesCleartextTraffic="true"

1
只添加 setAllowFileAccess(true) 就解决了我的问题(Android 7.0)。 - Mahm00d

16

在我的情况下,这是在将我的应用程序升级到SDK 30后发生的。解决方案如下:

WebSettings settings = webView.getSettings();
settings.setAllowFileAccess(true);

在SDK 30之前,默认设置为true,但现在是false。因此,您需要明确允许访问。


15

我刚开始开发安卓应用程序,即使我已经获得了权限,仍然遇到了相同的错误:

 <uses-permission android:name="android.permission.INTERNET"/>

然后我在模拟器内卸载了应用程序,重新构建,现在该应用程序可以访问互联网了。


9

检查是否已授予Internet权限:

<uses-permission android:name="android.permission.INTERNET"/>

并将以下内容放入清单中:

<application
    android:usesCleartextTraffic="true">
</application>

3
我已经做了两件事,但结果是一样的。 - Anuradha

3

以下是一个比被接受的答案更可能出现错误的场景,如果您正在尝试使用file://WebView中访问文件,则可能会出现此错误。

setAllowFileAccess的默认值从Android 11开始从true更改为false

对于目标版本为Build.VERSION_CODES.Q及以下的应用程序,默认值为true;对于目标版本为Build.VERSION_CODES.R及以上的应用程序,默认值为false。

这意味着您现在必须手动将其设置为true

webView.getSettings().setAllowFileAccess(true);

官方文档 获取更多信息。


3

请记住,如果您需要使用网络,您需要在清单文件中设置权限,在顶部添加类似于以下标签的 uses-permission 标签。

<uses-permission android:name="android.permission.INTERNET"/>

1

我也想加上我的关于文件访问被拒绝的观察。

1. 当您尝试使用存储(即内部存储器或外部存储器)中的文件时,它会发生。

您可以进行以下操作 -

a)在清单中声明标签:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

b) 当使用webview时,首先需要添加这两行代码。
webView.settings.allowContentAccess = true
webView.settings.allowFileAccess = true

In the last line of the webview you must use below statement

webView.loadUrl("file///....")

This is because, when you tried to loadUrl before allowContentAccess and 
allowFileAccess it is not able to read the storage. So, first allow access 
and the use loadurl. it will work perfectly fine every time.

2. 当您使用在线URL时-

a) 在清单文件中添加<uses-permission android:name="android.permission.INTERNET"/>

b) 在清单文件中的应用程序标签内使用android:usesCleartextTraffic="true"

c) 还需要添加此代码片段-

   webView.settings.allowContentAccess = true
   webView.settings.allowFileAccess = true
   webView.loadUrl("file///....")

希望你的代码能够正常运行。干杯 :)


你救了我的命。我的一切都很好,唯一的问题是loadUrl()在websettings属性之前编写。 - R. Rohilla

1

卸载然后重新安装对我有用。


1
请注意,"[...] 对我有用"并不是问题的真正答案,因为每个系统的工作方式都不同。我宁愿将其添加为评论或扩展您的解释。 - Dominik

0
  1. 在Android清单文件中提供权限。

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2.在AndroidManifest文件的<application标签中添加android:usesCleartextTraffic="true"

3.在WebView所在的类文件中添加以下两行代码。 secondwebView.settings.allowContentAccess = true

secondwebView.settings.allowFileAccess = true

这是我的代码。

package com.example.webview
class MainActivity : AppCompatActivity() {

lateinit var webView: WebView
lateinit var progressDialog:ProgressDialog

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    webView = findViewById(R.id.firstwebview)
    setUpMap()

    Handler().postDelayed(
        {
            progressDialog.dismiss()
        },2000)

}

@SuppressLint("SetJavaScriptEnabled")
private fun setUpMap() {

    progressDialog = ProgressDialog(this)
    progressDialog.setMessage("wait for loading")
    progressDialog.setCancelable(false)
    progressDialog.show()

    webView.settings.allowContentAccess = true
    webView.settings.allowFileAccess = true

    webView.settings.javaScriptEnabled = true
    webView.settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
    webView.loadUrl(
        "file:///android_asset/index.html"
    )

    webView.webChromeClient = object:WebChromeClient(){
        override fun onJsAlert(
            view: WebView?,
            url: String?,
            message: String?,
            result: JsResult?
        ): Boolean {
            return super.onJsAlert(view, url, message, result)
        }
    }

    webView.webViewClient = object : WebViewClient(){
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
        }
    }

}

}


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