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

webview打开本地Html文件

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

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

2.打开权限

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

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

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

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

复制代码
 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 可以这样处理

复制代码
<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>

否则可以这样处理下

复制代码
<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游戏

相关推荐
杨筱毅8 分钟前
【Android】Handler/Looper机制相关的类图和流程图
android·java·流程图
2501_918126911 小时前
用c语言写一个nes游戏模拟器
游戏
Kapaseker1 小时前
酷炫的文字效果 — Compose 文本着色
android·kotlin
努力进修1 小时前
【JavaEE初阶】 多线程编程核心:解锁线程创建、方法与状态的创新实践密码
android·java·java-ee
D155540880581 小时前
电竞护航小程序+公众号成品搭建游戏派单小程序开发游戏装备交易系统定制
游戏
生莫甲鲁浪戴1 小时前
Android Studio新手开发第二十八天
android·ide·android studio
wanhengidc2 小时前
云手机和云游戏的不同之处
运维·服务器·安全·游戏·智能手机
zhaoyufei1332 小时前
Android触屏TP驱动事件上报以及多点触摸
android
杨筱毅2 小时前
【Android】详细讲解ViewDragHelper的实现原理(不含代码版)
android
代码s贝多芬的音符9 小时前
ios android 小程序 蓝牙 CRC16_MODBUS
android·ios·小程序