对我来说这个问题有点儿傻,我最初在启动应用程序时忘记在清单中添加 android:usesCleartextTraffic="true"
。在我添加了 android:usesCleartextTraffic="true"
之后,它仍然给出了 ERR_ACCESS_DENIED
。然后我清除了数据,卸载了应用程序,重新安装,问题就解决了。
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
如果仍然无法正常工作,请尝试在您的清单文件中的应用程序标记中添加android:usesCleartextTraffic="true"
。setAllowFileAccess(true)
就解决了我的问题(Android 7.0)。 - Mahm00d在我的情况下,这是在将我的应用程序升级到SDK 30后发生的。解决方案如下:
WebSettings settings = webView.getSettings();
settings.setAllowFileAccess(true);
在SDK 30之前,默认设置为true,但现在是false。因此,您需要明确允许访问。
我刚开始开发安卓应用程序,即使我已经获得了权限,仍然遇到了相同的错误:
<uses-permission android:name="android.permission.INTERNET"/>
然后我在模拟器内卸载了应用程序,重新构建,现在该应用程序可以访问互联网了。
检查是否已授予Internet权限:
<uses-permission android:name="android.permission.INTERNET"/>
并将以下内容放入清单中:
<application
android:usesCleartextTraffic="true">
</application>
以下是一个比被接受的答案更可能出现错误的场景,如果您正在尝试使用file://
在WebView
中访问文件,则可能会出现此错误。
setAllowFileAccess
的默认值从Android 11开始从true
更改为false
。
对于目标版本为
Build.VERSION_CODES.Q
及以下的应用程序,默认值为true;对于目标版本为Build.VERSION_CODES.R
及以上的应用程序,默认值为false。
这意味着您现在必须手动将其设置为true
。
webView.getSettings().setAllowFileAccess(true);
官方文档 获取更多信息。
请记住,如果您需要使用网络,您需要在清单文件中设置权限,在顶部添加类似于以下标签的 uses-permission 标签。
<uses-permission android:name="android.permission.INTERNET"/>
我也想加上我的关于文件访问被拒绝的观察。
1. 当您尝试使用存储(即内部存储器或外部存储器)中的文件时,它会发生。
您可以进行以下操作 -
a)在清单中声明标签:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
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///....")
希望你的代码能够正常运行。干杯 :)
卸载然后重新安装对我有用。
<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)
}
}
}
}