我创建了一个活动,允许用户在该活动中向 ImageView 添加图片。我创建了一个按钮,用于打开活动的上下文菜单,并为用户提供从图库中选择图片或使用相机拍照的选项。
如果我选择第一个选项 - 从图库中挑选图片,它可以正常工作。图库打开,我选择了图片,我的活动被恢复,图片被添加到 ImageView。选择第二个选项,拍照并恢复我的活动
后,奇怪的事情开始发生:
- 如果我再次打开上下文菜单并尝试打开图库,则会打开相机活动
- 我关闭相机活动并恢复我的活动,显示“使用完成操作”对话框
- 我打开图库,选择一张图片并抛出 NullPointerException
为什么我有这种行为和异常?我尝试搜索类似的主题,但没有找到解决方案。
以下是我的活动的方法
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
switch(item.getItemId()) {
case R.id.cm_Select_picture: {
// TODO open gallery
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, ""), RC_SELECT_PICTURE);
}
case R.id.cm_Take_picture: {
// TODO open camera
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, RC_TAKE_PICTURE);
}
default: return false;
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK) {
switch(requestCode) {
case RC_SELECT_PICTURE: {
Log.d(TAG, "Case select picture");
Uri selectedImageUri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImageUri
, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap pic = BitmapFactory.decodeFile(filePath);
goodsImage.setImageBitmap(pic);
}
case RC_TAKE_PICTURE: {
Log.d(TAG, "Case take picture");
if(data.getExtras().get("data") != null) {
Bitmap pic = (Bitmap) data.getExtras().get("data");
goodsImage.setImageBitmap(pic);
}
}
}
}
}
04-26 01:34:59.529: E/AndroidRuntime(20531): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://media/external/images/media/9 }} to activity {com.forestassistant/com.statistics.GoodsActivity}: java.lang.NullPointerException