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

Android端通过WhatsApp分享QR码图片真机崩溃模拟器正常问题求助

问题根因

崩溃日志明确指向getImageUri方法中Uri.parse(path)触发空指针,本质是MediaStore.Images.Media.insertImage调用返回了null,导致传入Uri.parse的参数为空。出现模拟器正常、真机异常的核心原因是Android 6.0(API 23)以上的动态存储权限未适配,模拟器默认授予权限,而真机运行时没有拿到读写存储权限,导致插入图片到系统图库失败返回null。

其他代码逻辑错误

  • 构造分享Intent时多做了一次无意义的Uri转换:Uri.parse(imageUri.getPath()),imageUri本身就是合法的content://格式Uri,直接传imageUri即可,转成path再解析反而会丢失content协议标识,导致第三方应用无法读取文件。
  • 分享给第三方应用时没有添加FLAG_GRANT_READ_URI_PERMISSION权限标记,就算Uri正确,WhatsApp也没有权限读取你应用输出的图片文件。
  • 字符串比较用了==而不是equals,有可能导致菜单点击判断失效。

修复步骤

  1. 先适配动态存储权限
    在AndroidManifest.xml中先声明权限:
<!-- 安卓12及以下存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 安卓13及以上图片权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" />

在触发分享逻辑前,先判断有没有拿到对应存储权限,没有的话先申请权限,权限申请通过后再执行分享逻辑。

  1. 修复getImageUri方法的空指针防护
public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    if (path == null) {
        // 插入失败返回null,上层做异常提示
        return null;
    }
    return Uri.parse(path);
}
  1. 修复分享逻辑的错误
@Override
public boolean onContextItemSelected(MenuItem item) {
    // 字符串比较用equals避免空指针和判断错误
    if ("Share on Whatsapp".equals(item.getTitle())) {
        Uri imageUri = getImageUri(getApplicationContext(), bitmap);
        if (imageUri == null) {
            Toast.makeText(this, "图片生成失败,请检查存储权限", Toast.LENGTH_SHORT).show();
            return true;
        }
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        // 直接传入原始Uri,不需要二次转换
        shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
        shareIntent.setType("image/jpeg");
        // 给目标应用授予读取Uri的权限
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, "Share image via:"));
    } else if ("Share on Email".equals(item.getTitle())) {
        // 补充邮箱分享逻辑
    }
    return true;
}
  1. 针对Android 10及以上版本,建议替换MediaStore.insertImage为FileProvider方式生成Uri,适配分区存储规则,避免后续版本存储权限变更导致功能失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:24:03