Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)

webview打开本地Html文件

1.在路径前面加上file://

java 复制代码
            String filePath="file://"+path;
            webView.loadUrl( filePath);

2.打开权限

java 复制代码
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

3.启用JavaScript 设置本地访问权限

java 复制代码
 webView.getSettings().setJavaScriptEnabled(true);
 webSettings.setAllowContentAccess(true);

4.如果js代码访问本地文件出现CORS跨源请求 可以通过重写WebViewClient的shouldInterceptRequest函数拦截请求并替换为本地资源

java 复制代码
 webView.setWebViewClient(new WebViewClient(){
          
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                // 获取请求的URL
                String url = null;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    url = request.getUrl().toString();
                }
                // 检查URL是否符合你想要替换的file域规则
                if (url.startsWith("file://")) {
                    String path=url;
                    try {
                        if(path.contains(".jpg")||path.contains(".png")){
                            Map<String, String> headers = new HashMap<>();
                            headers.put("Access-Control-Allow-Origin", "*");
                            InputStream inputStream = new FileInputStream(new File(path));
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                                WebResourceResponse response= new WebResourceResponse("image/png", "UTF-8", inputStream);
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                                    response.setResponseHeaders(headers);
                                }
                                return response;
                            }
                        }
                        else {
                    } catch (IOException e) {
                        // 处理异常
                        e.printStackTrace();
                    }
                }

                // 如果不是file域请求,则返回null继续加载
                return super.shouldInterceptRequest(view, request);
            }
        });

5.如果H5项目中用到了Fetch 出现报错Fetch API cannot load 是因为Fetch不支持使用file://访问本地文件, 可以在html文件中处理下

如果是 arraybuffer 可以这样处理

html 复制代码
<script>window.fetch=function fetchLocal(url, data) {
  return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest
        xhr.onload = function () {
            resolve(new Response(xhr.response, { status: xhr.status }))
        }
        xhr.onerror = function () {
            reject(new TypeError('Local request failed'))
        }
        xhr.open('GET', url)
        xhr.responseType = "arraybuffer";
        xhr.send(null)
    })
}</script>

否则可以这样处理下

html 复制代码
<script>window.fetch=function fetchLocal(url, data) {
   return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest
    xhr.onload = function() {
      resolve(new Response(xhr.responseText, {status: xhr.status}))
    }
    xhr.onerror = function() {
      reject(new TypeError('Local request failed'))
    }
    xhr.open('GET', url)
    xhr.send(data)
  })
}</script>

至此,就可以离线访问本地的Unity,Cocos等H5游戏

相关推荐
兰琛10 分钟前
12.1 Android中协程的基本使用
android
程序猿多布1 小时前
Unity Excel导表工具转Lua文件
unity·excel
liujingtech2 小时前
Kotlin实践下来 takeIf 并不是所有场景的银弹
android
xvch3 小时前
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
android·kotlin
ianozo4 小时前
BUU40 [安洵杯 2019]easy_serialize_php
android·开发语言·php
abs6254 小时前
uniapp使用uts插件启动原生安卓Service
android·uni-app·uniapp uts插件·uniapp 安卓服务
Evaporator Core4 小时前
MATLAB在投资组合优化中的应用:从基础理论到实践
android
Neo Evolution5 小时前
Flutter与移动开发的未来:谷歌的技术愿景与实现路径
android·人工智能·学习·ios·前端框架·webview·着色器
coooliang5 小时前
Flutter项目中设置安卓启动页
android·flutter
xianrenli385 小时前
android 使用 zstd算法压缩文件
android