Android相机Activity传递ResultInfo失败问题求助
问题分析与解决方案
首先,咱们得先搞清楚为什么data会是null——这其实不是BUG,是相机Intent的正常行为!当你通过MediaStore.EXTRA_OUTPUT指定了图片的保存路径时,相机App会直接把拍摄的图片写入你指定的文件,不会把图片数据塞进返回的Intent data里,所以onActivityResult里拿到的data自然就是null。你之前加data!=null的判断,相当于直接跳过了跳转第二个Activity的逻辑,所以才会回到第一个Activity。
那正确的处理方式应该是这样的:
1. 不用依赖返回的data,直接用你保存的mCurrentPhotoPath
既然你已经确认mCurrentPhotoPath能正常返回文件路径,那在onActivityResult里,只要resultCode是RESULT_OK,就直接用这个路径构建跳转第二个Activity的Intent即可。
2. 修正onActivityResult代码
把你的onActivityResult改成下面这样:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 只需要判断请求码和结果码,不用管data是否为null if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // 构建跳转到第二个Activity的Intent Intent secondIntent = new Intent(this, YourSecondActivity.class); // 把图片路径传递过去 secondIntent.putExtra("EXTRA_IMAGE_PATH", mCurrentPhotoPath); // 启动第二个Activity startActivity(secondIntent); } }
3. 额外注意事项(避免踩坑)
- 全局变量的持久化:如果你的Activity可能发生重建(比如屏幕旋转),要记得在
onSaveInstanceState里保存mCurrentPhotoPath,否则重建后路径会丢失:@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("PHOTO_PATH", mCurrentPhotoPath); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mCurrentPhotoPath = savedInstanceState.getString("PHOTO_PATH"); } - Android 7.0+的Uri权限问题:如果你是用
FileProvider生成的Uri来启动相机(避免FileUriExposedException),那在传递路径给第二个Activity时,直接传文件路径是没问题的;如果要传Uri,记得给第二个Activity授予临时权限:secondIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - Android 10+的存储权限:建议用
getExternalFilesDir(Environment.DIRECTORY_PICTURES)来保存图片,这个目录属于App私有存储,不需要申请WRITE_EXTERNAL_STORAGE权限,避免权限问题。
总结
你之前的核心问题是误解了相机Intent返回data的逻辑——指定EXTRA_OUTPUT后data就是空的,这是正常的。跳过data!=null的判断,直接用你自己保存的mCurrentPhotoPath传递给第二个Activity就可以解决问题啦。
内容的提问来源于stack exchange,提问作者Toton
相关产品推荐
相关产品推荐

