Android SDK 29环境下WebView拍照保存为0B无法上传问题求助
问题根源与修复方案
核心错误点
- 分区存储适配错误(SDK29核心问题):Android 10(SDK29)开始启用分区存储机制,禁止应用直接通过
Uri.fromFile()共享文件路径给第三方应用,系统相机拿到该路径后没有写入权限,无法写入拍摄内容,最终生成0B大小的空文件。 - 意图配置完全错误:
onShowFileChooser方法里两个核心意图配置全部写错:- 本来用于选择本地图片的
contentSelectionIntent被错误设置为ACTION_IMAGE_CAPTURE(拍照动作),正确应为Intent.ACTION_GET_CONTENT - 文件选择器
chooserIntent也被错误设置为ACTION_IMAGE_CAPTURE,正确应为用Intent.createChooser方法创建选择器
- 本来用于选择本地图片的
- MediaStore文件未更新就绪状态:通过
ContentResolver.insert插入MediaStore的图片默认标记为待写入状态(IS_PENDING=1),相机写完内容后如果不主动把状态更新为就绪(IS_PENDING=0),上传逻辑会判定文件未完成写入,无法读取内容。
修复步骤
- 修正
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);
- 在
onActivityResult拍照返回逻辑中添加MediaStore状态更新:
// 拍摄完成后更新文件状态为就绪 ContentValues updateValues = new ContentValues(); updateValues.put(MediaStore.MediaColumns.IS_PENDING, 0); getContentResolver().update(capturedUri, updateValues, null, null);
- 清单文件权限适配:
<!-- 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
相关产品推荐
相关产品推荐

