安卓+h5如何传输文件引用?

项目中使用 WebView 加载了一个页面,现在需要在安卓中把一个File对象传输到H5中使用,就像使用<input type="file"/>那样,可以通过input.files[0]获取到H5的File对象(它不会将文件读取到内存中),目前传输文件只能通过input方式,但是必须要用户点击才能触发。

<android.webkit.WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:ignore="MissingConstraints"
        android:background="#FFFFFF" />

需要获取这样的对象:
image.png

  • 怎么才能不通过input方式直接传入File引用对象?目前只找到用base64字符串和fetch的方式,但他们都会将文件读取到内存中。
阅读 405
1 个回答

用ContentProvider和自定义协议:


public class FileProvider extends ContentProvider {
    // 实现相关方法
}

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (request.getUrl().toString().startsWith("file-proxy://")) {
            // 处理文件请求
            // 返回文件流而不是整个文件内容
            return new WebResourceResponse(...);
        }
        return super.shouldInterceptRequest(view, request);
    }
});

webView.addJavascriptInterface(new Object() {
    @JavascriptInterface
    public String getFileUrl() {
        return "file-proxy://local-file";
    }
}, "Android");

然后在H5页面里:

const fileUrl = window.Android.getFileUrl();
const response = await fetch(fileUrl);
const file = new File([response], "filename.jpg", {type: "image/jpeg"});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题