Android Webview网页不可用错误文件找不到

Android Webview网页不可用错误文件找不到,android,kotlin,webview,Android,Kotlin,Webview,我一直在使用Kotlin开发android应用程序。最近,我一直在尝试在android的Webview帮助下使用Javascript实现视频调用,问题是当加载Webview所在的活动时,它不会显示HTML页面。 据我所知,一切都准备就绪,我所研究的代码应该很好。我已经重建了应用程序,但它仍然无法工作 下面的代码框显示了加载页面的正确方式,但我只得到一个:“ERR\u FILE\u NOT\u FOUND” 然后,我尝试使用以下文件路径语法访问该页面: val filePath = "

我一直在使用Kotlin开发android应用程序。最近,我一直在尝试在android的Webview帮助下使用Javascript实现视频调用,问题是当加载Webview所在的活动时,它不会显示HTML页面。 据我所知,一切都准备就绪,我所研究的代码应该很好。我已经重建了应用程序,但它仍然无法工作

下面的代码框显示了加载页面的正确方式,但我只得到一个:“ERR\u FILE\u NOT\u FOUND”

然后,我尝试使用以下文件路径语法访问该页面:

val filePath = "./src/main/assets/Content/call.html"
它工作了,它停止显示错误,但这是一个问题,因为它在物理设备上不是那样工作的

logcat中还显示了此错误:

E/AndroidProtocolHandler: Unable to open asset URL: file:///android_asset/Content/call.html
我还尝试将文件移到内容文件夹之外,但不起作用


这也许是一个非常简单的错误,但我找不到解决办法。如果您能帮助我,我们将不胜感激,谢谢。

您应该使用WebViewAssetLoader。这是android推荐的加载静态网页的方法,您不应该使用文件路径

将在以下路径中承载文件-http://appassets.androidplatform.net/assets/

就你的情况而言,是—

示例代码:

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
          .addPathHandler("/assets/", new AssetsPathHandler(this))
          .build();

 webView.setWebViewClient(new WebViewClient() {
     @Override
     @RequiresApi(21)
     public WebResourceResponse shouldInterceptRequest(WebView view,
                                      WebResourceRequest request) {
         return assetLoader.shouldInterceptRequest(request.getUrl());
     }

     @Override
     @SuppressWarnings("deprecation") // for API < 21
     public WebResourceResponse shouldInterceptRequest(WebView view,
                                      WebResourceRequest request) {
         return assetLoader.shouldInterceptRequest(Uri.parse(request));
     }
 });

 WebSettings webViewSettings = webView.getSettings();
 // Setting this off for security. Off by default for SDK versions >= 16.
 webViewSettings.setAllowFileAccessFromFileURLs(false);
 // Off by default, deprecated for SDK versions >= 30.
 webViewSettings.setAllowUniversalAccessFromFileURLs(false);
 // Keeping these off is less critical but still a good idea, especially if your app is not
 // using file:// or content:// URLs.
 webViewSettings.setAllowFileAccess(false);
 webViewSettings.setAllowContentAccess(false);

 // Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
 // If the application's assets are in the "main/assets" folder this will read the file
 // from "main/assets/www/index.html" and load it as if it were hosted on:
 // https://appassets.androidplatform.net/assets/www/index.html
 webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");
 
final WebViewAssetLoader assetLoader=new WebViewAssetLoader.Builder()
.addPathHandler(“/assets/”,新的AssetsPathHandler(此))
.build();
setWebViewClient(新的WebViewClient(){
@凌驾
@要求API(21)
公共WebResourceResponse应接受请求(WebView,
WebResourceRequest(请求){
返回assetLoader.shouldInterceptRequest(request.getUrl());
}
@凌驾
@SuppressWarnings(“弃用”)//对于API<21
公共WebResourceResponse应接受请求(WebView,
WebResourceRequest(请求){
返回assetLoader.shouldInterceptRequest(Uri.parse(request));
}
});
WebSettings webViewSettings=webView.getSettings();
//为了安全起见,把它放在一边。对于大于等于16的SDK版本,默认情况下关闭。
webViewSettings.setAllowFileAccessFromFileURLs(false);
//默认情况下关闭,SDK版本>=30时不推荐使用。
webViewSettings.setAllowUniversalAccessFromFileURLs(false);
//保持这些功能不太重要,但仍然是一个好主意,尤其是如果你的应用程序不是
//使用file://或content://URL。
webViewSettings.setAllowFileAccess(false);
webViewSettings.setAllowContentAccess(false);
//资产托管在http(s)下://appassets.androidplatform.net/Assets/。
//如果应用程序的资产位于“main/assets”文件夹中,则会读取该文件
//从“main/assets/www/index.html”加载,并将其作为主机加载到:
// https://appassets.androidplatform.net/assets/www/index.html
webview.loadUrl(“https://appassets.androidplatform.net/assets/www/index.html");

我刚刚解决了我的具体问题。 事实证明,我的“资产”文件夹不在“主”文件夹中,而是在“src”中的另一个文件夹中。我刚刚在“main”中创建了一个新的assets文件夹,并将文件放在那里,现在HTML页面可以正常加载。必须进入项目视图

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
          .addPathHandler("/assets/", new AssetsPathHandler(this))
          .build();

 webView.setWebViewClient(new WebViewClient() {
     @Override
     @RequiresApi(21)
     public WebResourceResponse shouldInterceptRequest(WebView view,
                                      WebResourceRequest request) {
         return assetLoader.shouldInterceptRequest(request.getUrl());
     }

     @Override
     @SuppressWarnings("deprecation") // for API < 21
     public WebResourceResponse shouldInterceptRequest(WebView view,
                                      WebResourceRequest request) {
         return assetLoader.shouldInterceptRequest(Uri.parse(request));
     }
 });

 WebSettings webViewSettings = webView.getSettings();
 // Setting this off for security. Off by default for SDK versions >= 16.
 webViewSettings.setAllowFileAccessFromFileURLs(false);
 // Off by default, deprecated for SDK versions >= 30.
 webViewSettings.setAllowUniversalAccessFromFileURLs(false);
 // Keeping these off is less critical but still a good idea, especially if your app is not
 // using file:// or content:// URLs.
 webViewSettings.setAllowFileAccess(false);
 webViewSettings.setAllowContentAccess(false);

 // Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
 // If the application's assets are in the "main/assets" folder this will read the file
 // from "main/assets/www/index.html" and load it as if it were hosted on:
 // https://appassets.androidplatform.net/assets/www/index.html
 webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");