uni-app 小程序 webview 访问 uni 打包的 h5 页面中无法唤起图片选择

uni-app 小程序 webview 访问 uni 打包的 h5 页面中无法唤起图片选择

15 回复

微信小程序,兼容web-view需要引入微信JS-SDK。
参考文档: https://uniapp.dcloud.io/component/web-view.html#getenv 微信小程序 web-view网页中支持的JS API

更多关于uni-app 小程序 webview 访问 uni 打包的 h5 页面中无法唤起图片选择的实战教程也可以访问 https://www.itying.com/category-93-b0.html


谢谢!

回复 yang_zhang: 点个赞再走呀

小程序能分享下么

现在是测试阶段,体验版

打开 开发者调试 试一试

浏览器,微信扫码都是正常的,小程序访问有的手机能唤起选择功能,我这个就不行

回复 3***@qq.com: 就是你用hx写的H5,让后把这个H5放到微信小程序中的webview调用了 然后是H5无法选择图片对吧 然后有的可以 有的不行 是什么情况下行 生么情况下不行呢

回复 小枫叶: 暂时还没发现什么规律,别人也是vivo手机,就可以打开相册,我的也是vivo,点击就没反应,所以不知道是不是个例

鸿蒙系统和部分安卓11是无法调用相册的 这个用 小程序web-view就调用不出来 没任何反应

请问怎么解决的呢,我也遇到同样的问题

我也遇到了,大概找到原因了,无论是chooseImage还是原生的input:file,只要设置了多选就无法唤起选择弹框,这是部分浏览器限制的,目前只支持一次选一张。还没有找到其他解决方法

我加了选择限制一张就好了,感谢感谢

我回头试试,感谢感谢

在 Uni-app 中,如果你在小程序的 webview 中加载了 Uni-app 打包的 H5 页面,并且在该 H5 页面中无法唤起图片选择功能,可能是由于以下几个原因:

1. 小程序 webview 的限制

小程序中的 webview 组件本身并不支持直接调用原生的图片选择功能。小程序和 H5 的运行环境不同,小程序有自己的 API 来调用图片选择(如 wx.chooseImage),而 H5 中通常使用 <input type="file"> 来实现图片选择。

如果你在 H5 页面中使用的是 <input type="file">,在小程序的 webview 中可能无法正常触发。

2. 解决方案

如果你需要在 webview 中实现图片选择功能,可以考虑以下解决方案:

  • 方案一:使用小程序的图片选择 API 在 H5 页面中,可以通过 uni.postMessage 与小程序进行通信,调用小程序的图片选择 API(如 wx.chooseImage)。具体步骤如下:

    1. 在 H5 页面中,通过 uni.postMessage 发送消息给小程序,请求图片选择。
    2. 在小程序端监听 webviewmessage 事件,接收到消息后调用小程序的图片选择 API。
    3. 选择完图片后,将图片信息通过 webviewpostMessage 方法传回给 H5 页面。

    示例代码:

    // H5 页面
    function chooseImage() {
        if (window.uni && uni.postMessage) {
            uni.postMessage({ action: 'chooseImage' });
        } else {
            // 非小程序环境下,直接使用 <input type="file">
            const input = document.createElement('input');
            input.type = 'file';
            input.accept = 'image/*';
            input.onchange = function (event) {
                const file = event.target.files[0];
                // 处理文件
            };
            input.click();
        }
    }
    
    // 监听小程序返回的图片信息
    window.addEventListener('message', function (event) {
        const data = event.data;
        if (data.action === 'imageSelected') {
            const imageUrl = data.imageUrl;
            // 处理图片
        }
    });
    
    // 小程序端
    Page({
        onLoad() {
            const webViewContext = uni.createWebViewContext('webview');
            this.webViewContext = webViewContext;
        },
        onMessage(event) {
            const data = event.detail.data;
            if (data.action === 'chooseImage') {
                wx.chooseImage({
                    count: 1,
                    success: (res) => {
                        const tempFilePaths = res.tempFilePaths;
                        this.webViewContext.postMessage({
                            action: 'imageSelected',
                            imageUrl: tempFilePaths[0]
                        });
                    }
                });
            }
        }
    });
回到顶部