Android PhotoPicker返回NULL URI问题排查求助
问题:相同PhotoPicker代码在现有项目返回NULL URI,新项目正常运行
相关代码
ActivityResultLauncher<PickVisualMediaRequest> pickImage = registerForActivityResult(new ActivityResultContracts.PickVisualMedia(), uri -> { if(uri==null) { //URI always NULL here } else { //Never reached } });
pickImage.launch(new PickVisualMediaRequest.Builder() .setMediaType(ActivityResultContracts.PickVisualMedia.ImageOnly.INSTANCE) .build());
可能的原因及排查方向
权限缺失或未授权
Android 13及以上版本调用PhotoPicker需要READ_MEDIA_IMAGES权限。新项目可能默认完成了权限申请流程,而现有项目要么未在清单中声明权限,要么用户之前拒绝权限后没有重新请求逻辑。
排查:检查AndroidManifest.xml是否添加权限声明:<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />同时在调用
launch()前先检查权限状态,未授权则发起权限请求。依赖版本过低
现有项目的activity-ktx或appcompat依赖版本过旧,可能存在PickVisualMedia合约的兼容性bug,而新项目使用了较新的依赖版本。
排查:打开Module级别的build.gradle,确保activity-ktx版本不低于1.6.0:implementation 'androidx.activity:activity-ktx:1.6.0+'生命周期回调注册时机错误
若registerForActivityResult在Activity的onStart或Fragment的onCreateView之后才注册,或因配置变化(如屏幕旋转)导致组件重建后未重新注册回调,都会导致无法接收结果。
排查:确保registerForActivityResult在Activity的onCreate或Fragment的onCreate方法中完成注册。清单文件配置冲突
现有项目中目标Activity若设置了singleInstance或singleTask启动模式,会打断ActivityResult的回调流程,导致返回NULL。
排查:检查Activity的launchMode设置,尝试改为standard或singleTop后测试。厂商定制系统限制
部分国产厂商的定制系统可能对PhotoPicker做了修改,导致返回结果异常。可换一台原生Android设备测试现有项目,确认是否为厂商系统问题。
内容的提问来源于stack exchange,提问作者Viru Narala

