Android调用WhatsApp分享报错:变量uri可能未初始化问题排查
错误根因
这个编译错误来自两个问题:
- 局部变量
uri声明时没有设置初始值,Java在编译阶段会检查所有分支下局部变量是否完成初始化才允许被使用。 - 你的else分支存在严重逻辑笔误:
new File((String)uri)这行试图在uri还没赋值的时候,强转uri作为文件路径传入,编译器直接判定这一分支下uri无法被正确初始化,因此抛出编译错误。这里你本来要传的文件路径其实是方法入参paramString,不是未初始化的uri。
修复后代码
public static void repostWhatsApp(Context paramContext, boolean paramBoolean, String paramString) { Uri uri = null; Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType(paramBoolean ? "video/*" : "image/*"); if (paramString.startsWith("content")) { uri = Uri.parse(paramString); } else { String fileProviderAuthority = paramContext.getPackageName() + ".provider"; uri = FileProvider.getUriForFile(paramContext, fileProviderAuthority, new File(paramString)); } // 授予WhatsApp访问文件的临时权限,否则会报权限错误 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(Intent.EXTRA_STREAM, uri); intent.setPackage("com.whatsapp"); // 校验设备是否安装WhatsApp,避免崩溃 if (intent.resolveActivity(paramContext.getPackageManager()) != null) { paramContext.startActivity(intent); } }
补充说明
- 硬编码的Intent action、extra常量全部替换为SDK内置的
Intent类常量,避免拼写错误 - MIME类型统一使用小写,兼容更多机型的Intent匹配规则
- 新增
FLAG_GRANT_READ_URI_PERMISSION是分享FileProvider文件的必填配置,否则第三方应用无权读取对应文件资源 - 启动Activity前增加Activity存在性校验,防止用户未安装WhatsApp时触发
ActivityNotFoundException崩溃
内容的提问来源于stack exchange,提问作者Atif Aslam
相关产品推荐
相关产品推荐

