我有以下代码,用于抓取图像(来自相机或画廊),然后将其显示在 ImageView 上:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode == RESULT_OK)
{
if(requestCode == 1888)
{
final boolean isCamera;
if(data == null)
{
isCamera = true;
}
else
{
final String action = data.getAction();
if(action == null)
{
isCamera = false;
}
else
{
isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
}
}
Uri selectedImageUriTemp;
Uri selectedImageUri;
if(isCamera)
{
selectedImageUriTemp = outputFileUri;
Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath()));
selectedImageUri = getImageUri(image);
}
else
{
selectedImageUriTemp = data == null ? null : data.getData();
Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath()));
selectedImageUri = getImageUri(image);
}
Log.i("TAG", "IMAGEURI: " + selectedImageUri);
pictureThumb.setImageURI(selectedImageUri);
setRealPath(selectedImageUri);
}
}
}
private Uri getImageUri(Bitmap image){
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = Images.Media.insertImage(getApplicationContext().getContentResolver(), image, "Title", null);
return Uri.parse(path);
}
如果我尝试使用相机抓取图像,代码可以正常工作,但是当我尝试从画廊抓取图像时,它会返回 NULL 指针异常。
任何人都可以建议我正确的方向吗?谢谢
这是完整的日志:
02-12 10:34:56.249: E/AndroidRuntime(14607): FATAL EXCEPTION: main
02-12 10:34:56.249: E/AndroidRuntime(14607): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=Intent { dat=content://media/external/images/media/29 }} to activity {com.gelliesmedia.thumbqoo/com.gelliesmedia.thumbqoo.PictureBooth}: java.lang.NullPointerException: uriString
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.deliverResults(ActivityThread.java:3216)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3259)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.access$1100(ActivityThread.java:138)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1253)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.os.Looper.loop(Looper.java:137)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.main(ActivityThread.java:4954)
02-12 10:34:56.249: E/AndroidRuntime(14607): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 10:34:56.249: E/AndroidRuntime(14607): at java.lang.reflect.Method.invoke(Method.java:511)
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
02-12 10:34:56.249: E/AndroidRuntime(14607): at dalvik.system.NativeStart.main(Native Method)
02-12 10:34:56.249: E/AndroidRuntime(14607): Caused by: java.lang.NullPointerException: uriString
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri$StringUri.<init>(Uri.java:464)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri$StringUri.<init>(Uri.java:454)
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri.parse(Uri.java:426)
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.gelliesmedia.thumbqoo.PictureBooth.getImageUri(PictureBooth.java:224)
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.gelliesmedia.thumbqoo.PictureBooth.onActivityResult(PictureBooth.java:206)
最佳答案
你的 onActivityResult 很乱。
尝试以这种方式编写代码...... 下面定义了两个方法,分别从相机捕获图像和从图库中捕获图像。
protected void captureFromCamera() {
// TODO Auto-generated method stub
Intent cameraIntent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent,
UploadProfilePicActivity.REQ_CAMERA);
}
private void selectImageFromGallery() {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
getString(R.string.upload_profile_photo)),
UploadProfilePicActivity.REQ_GALLERY);
}
现在 onActivityResult 你的代码可能是这样的..
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == UploadProfilePicActivity.REQ_GALLERY && data != null
&& data.getData() != null) {
Uri _uri = data.getData();
try {
Bitmap profileBmp = Media.getBitmap(getContentResolver(), _uri);
if (profileBmp != null) {
image.setImageBitmap(profileBmp);
}
} catch (OutOfMemoryError e) {
Utility.displayToast(context,
getString(R.string.err_large_image));
} catch (Exception e) {
}
} else if (requestCode == UploadProfilePicActivity.REQ_CAMERA
&& data != null) {
try {
Bitmap profileBmp = (Bitmap) data.getExtras().get("data");
if (profileBmp != null) {
image.setImageBitmap(profileBmp);
}
} catch (OutOfMemoryError e) {
Utility.displayToast(context,
getString(R.string.err_large_image));
} catch (Exception e) {
}
}
}
使用参数即 requestCode
和 responseCode
更好地实现 onActivityResult
关于android - 从图库中抓取图片时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718138/