Android data.getData() returns 某些手机的 CameraActivity 为空
Android data.getData() returns null from CameraActivity for some phones
我在 Activity 从相机 activity 返回的结果中出现致命错误。让我摸不着头脑的是,错误只发生在少数手机上(基于受影响的用户数量),而大多数人似乎没有任何问题。我可以在我的 Nexus 6 (运行 Lollipop 5.1.1) 上复制错误,而我的 Note 5 (也是 5.1.1) 完全没有问题。
问题是当我尝试从 data.getData() 分配 imageUri 时。在 Note 5 上调试,data.mData 等于 "content://media/external/images/media/2215",而在 Nexus 6 上,data.mData 为空。
我知道这是在 SO 上提出的一个常见问题,但到目前为止我还没有找到任何对我有帮助的问题。谁能指出我的解决方案并提供答案?
方法启动相机 Activity 结果
@OnClick(R.id.change_image_camera) public void takePicture(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}
onActvityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Uri imageUri = data.getData(); //The trouble is here
String realPath = Image.getPath(this, imageUri); //getPath crashes because imageUri is null
Image.compressImage(realPath);
File file = new File(realPath);
Bundle extra = new Bundle();
extra.putString("URL", realPath);
returnIntent.putExtras(extra);
setResult(RESULT_OK, returnIntent);
finish();
}
}
非常感谢您对此提供的任何帮助!
Uri imageUri = data.getData(); //The trouble is here
相机应用不需要 return Uri
指向照片,因为那不是 the ACTION_IMAGE_CAPTURE
Intent
protocol 的一部分。或者:
在你的ACTION_IMAGE_CAPTURE
Intent
中提供EXTRA_OUTPUT
,这样你就知道图像应该存储在哪里,不需要依赖getData()
,或
在响应 Intent
中使用额外的 data
,这将是图像缩略图的 Bitmap
您的下一个错误在这里:
String realPath = Image.getPath(this, imageUri);
不要求将图像存储为您可以访问的文件,除非您通过 EXTRA_OUTPUT
.
提供到该位置的路径
if(resultCode == RESULT_OK){
Bitmap bitmap = (Bitmap) imageReturnedIntent.getExtras().get("data");
imageView.setImageBitmap(bitmap);
}
我在 Activity 从相机 activity 返回的结果中出现致命错误。让我摸不着头脑的是,错误只发生在少数手机上(基于受影响的用户数量),而大多数人似乎没有任何问题。我可以在我的 Nexus 6 (运行 Lollipop 5.1.1) 上复制错误,而我的 Note 5 (也是 5.1.1) 完全没有问题。
问题是当我尝试从 data.getData() 分配 imageUri 时。在 Note 5 上调试,data.mData 等于 "content://media/external/images/media/2215",而在 Nexus 6 上,data.mData 为空。
我知道这是在 SO 上提出的一个常见问题,但到目前为止我还没有找到任何对我有帮助的问题。谁能指出我的解决方案并提供答案?
方法启动相机 Activity 结果
@OnClick(R.id.change_image_camera) public void takePicture(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}
onActvityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Uri imageUri = data.getData(); //The trouble is here
String realPath = Image.getPath(this, imageUri); //getPath crashes because imageUri is null
Image.compressImage(realPath);
File file = new File(realPath);
Bundle extra = new Bundle();
extra.putString("URL", realPath);
returnIntent.putExtras(extra);
setResult(RESULT_OK, returnIntent);
finish();
}
}
非常感谢您对此提供的任何帮助!
Uri imageUri = data.getData(); //The trouble is here
相机应用不需要 return Uri
指向照片,因为那不是 the ACTION_IMAGE_CAPTURE
Intent
protocol 的一部分。或者:
在你的
ACTION_IMAGE_CAPTURE
Intent
中提供EXTRA_OUTPUT
,这样你就知道图像应该存储在哪里,不需要依赖getData()
,或在响应
Intent
中使用额外的data
,这将是图像缩略图的Bitmap
您的下一个错误在这里:
String realPath = Image.getPath(this, imageUri);
不要求将图像存储为您可以访问的文件,除非您通过 EXTRA_OUTPUT
.
if(resultCode == RESULT_OK){
Bitmap bitmap = (Bitmap) imageReturnedIntent.getExtras().get("data");
imageView.setImageBitmap(bitmap);
}