Android开发:startActivityForResult传递的extra在onActivityResult中为空
问题分析与解决方法
你遇到的这个问题其实很常见,核心原因是:系统相册应用返回的Intent并不会携带你当初发起请求时添加的额外数据。
当你调用startActivityForResult(pickPhoto , LOAD_IMG_REQUEST)时,pickPhoto这个Intent是发给系统相册应用的,但系统相册处理完图片选择操作后,会创建一个全新的Intent来返回结果——这个新Intent只会包含选中图片的Uri,完全不会保留你之前通过putExtra添加的gpsLng数据,所以你在onActivityResult里调用getStringExtra("gpsLng")自然会得到null。
推荐的解决方法
最直接简单的方式是用成员变量临时存储坐标数据,具体步骤如下:
- 在你的主Activity
gui中添加一个成员变量,用来保存长按地图得到的坐标,同时把请求码定义为可访问的常量:
public class gui extends AppCompatActivity { // 定义请求码常量,确保InitialMapLoad能访问到 public static final int LOAD_IMG_REQUEST = 1001; private LatLng mSelectedMapPos; // 用来存储长按得到的坐标 // ... 其他原有代码 }
- 在
InitialMapLoad的onMapLongClick方法中,点击确定按钮时把选中的坐标赋值给主Activity的成员变量:
imgSelectPopup.setPositiveButton(R.string.btnOpenGallery, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // 把长按得到的坐标存到主Activity的成员变量里 ((gui)lActivity).mSelectedMapPos = mClickPos; lActivity.startActivityForResult(pickPhoto , gui.LOAD_IMG_REQUEST); } });
- 最后在
gui的onActivityResult中直接使用这个成员变量:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); if (requestCode == LOAD_IMG_REQUEST) { if(resultCode == RESULT_OK){ Uri selectedImage = imageReturnedIntent.getData(); Log.e(TAG, "onActivityResult: 图片Uri=" + selectedImage ); // 直接读取之前存储的坐标 if(mSelectedMapPos != null){ Log.e(TAG, "onActivityResult: 经度=" + mSelectedMapPos.longitude ); Log.e(TAG, "onActivityResult: 纬度=" + mSelectedMapPos.latitude ); } } } }
其他可选方案
如果你觉得成员变量的方式不够优雅,也可以根据项目复杂度选择:
- 使用
ViewModel来跨组件共享数据(适合更复杂的页面架构) - 用
SharedPreferences临时存储坐标字符串(适合简单数据,但记得用完清理)
不过对于你当前的新手项目,成员变量的方式是最容易理解和快速实现的。
内容的提问来源于stack exchange,提问作者SXN
相关产品推荐
相关产品推荐

