You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView应用无文件/照片访问权限致OCR按钮失效求助

WebView中Tesseract.js OCR按钮无响应的解决方法

WebView默认的安全限制和配置会导致依赖JS的功能(比如Tesseract.js的OCR)无法正常工作,以下是针对性的修复步骤:

1. 开启WebView的JavaScript及存储支持

在初始化WebView时,必须启用JavaScript、DOM存储及文件访问权限,这些是Tesseract.js运行的基础:

WebSettings webSettings = webView.getSettings();
// 启用JavaScript
webSettings.setJavaScriptEnabled(true);
// 启用DOM存储,Tesseract需要存储临时识别数据
webSettings.setDomStorageEnabled(true);
// 允许文件访问(加载本地训练数据或图片时需要)
webSettings.setAllowFileAccess(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);

2. 添加必要的系统权限

在AndroidManifest.xml中声明OCR功能需要的权限,同时注意6.0以上系统要动态申请敏感权限:

静态权限声明(AndroidManifest.xml)

<!-- 网络权限:如果Tesseract在线加载训练数据 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 相机权限:如果需要拍照识别 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 存储权限:读取本地图片或保存临时文件 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 针对Android 13+的存储权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

动态申请权限(Activity中)

// 检查并请求相机和存储权限
private void requestPermissions() {
    String[] permissions;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_MEDIA_IMAGES};
    } else {
        permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE};
    }
    
    if (ContextCompat.checkSelfPermission(this, permissions[0]) != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this, permissions[1]) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, permissions, 100);
    }
}

3. 处理文件选择逻辑

如果你的OCR功能需要选择本地图片或拍照,WebView默认不支持文件选择器,需要重写WebChromeClient的文件选择回调:

private ValueCallback<Uri[]> filePathCallback;

// 初始化WebView时设置WebChromeClient
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        // 保存回调对象,用于后续返回结果
        MainActivity.this.filePathCallback = filePathCallback;
        // 打开系统文件选择器
        Intent intent = fileChooserParams.createIntent();
        try {
            startActivityForResult(intent, 101);
        } catch (ActivityNotFoundException e) {
            filePathCallback.onReceiveValue(null);
            return false;
        }
        return true;
    }
});

// 处理文件选择结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 101) {
        Uri[] results = WebChromeClient.FileChooserParams.parseResult(resultCode, data);
        if (filePathCallback != null) {
            filePathCallback.onReceiveValue(results);
            filePathCallback = null;
        }
    }
}

4. 检查Tesseract.js训练数据的访问路径

如果你的Tesseract.js使用本地训练数据,确保WebView能正确访问到文件:

  • 若训练数据放在assets目录,使用file:///android_asset/[路径]加载;
  • 避免使用跨域路径,确保训练数据的URL和网页URL同源。

内容的提问来源于stack exchange,提问作者bathanhlsp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:57:41