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

Android SDK 29环境下WebView拍照保存为0B无法上传问题求助

问题根源与修复方案

核心错误点

  • 分区存储适配错误(SDK29核心问题):Android 10(SDK29)开始启用分区存储机制,禁止应用直接通过Uri.fromFile()共享文件路径给第三方应用,系统相机拿到该路径后没有写入权限,无法写入拍摄内容,最终生成0B大小的空文件。
  • 意图配置完全错误:onShowFileChooser方法里两个核心意图配置全部写错:
    1. 本来用于选择本地图片的contentSelectionIntent被错误设置为ACTION_IMAGE_CAPTURE(拍照动作),正确应为Intent.ACTION_GET_CONTENT
    2. 文件选择器chooserIntent也被错误设置为ACTION_IMAGE_CAPTURE,正确应为用Intent.createChooser方法创建选择器
  • MediaStore文件未更新就绪状态:通过ContentResolver.insert插入MediaStore的图片默认标记为待写入状态(IS_PENDING=1),相机写完内容后如果不主动把状态更新为就绪(IS_PENDING=0),上传逻辑会判定文件未完成写入,无法读取内容。

修复步骤

  1. 修正onShowFileChooser里的意图配置:
// 修正本地文件选择意图
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("image/*");

// 修正选择器创建逻辑
Intent chooserIntent = Intent.createChooser(contentSelectionIntent, "Image Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
  1. 在onActivityResult拍照返回逻辑中添加MediaStore状态更新:
// 拍摄完成后更新文件状态为就绪
ContentValues updateValues = new ContentValues();
updateValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
getContentResolver().update(capturedUri, updateValues, null, null);
  1. 清单文件权限适配:
<!-- targetSdk >= 30 用这个权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- targetSdk <= 29 用下面的权限,可加android:requestLegacyExternalStorage="true"临时兼容 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />

内容的提问来源于stack exchange,提问作者Martin De Beer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:02