0

我已经在我的应用程序中实现了拍照和裁剪。通常它工作得很好。但问题出现在具有 Cooliris 图库的设备上。拍摄图像后出现“Gallery(process com.cooliris.media) 已意外停止”消息。不幸的是,我没有这样的设备,也无法测试它。但是我有一个来自崩溃日志的堆栈跟踪。

E/AndroidRuntime(20624): Caused by: java.lang.NullPointerException
E/AndroidRuntime(20624):    at com.cooliris.media.CropImage.loadBitmap(CropImage.java:460)
E/AndroidRuntime(20624):    at com.cooliris.media.CropImage.onCreate(CropImage.java:443)
E/AndroidRuntime(20624):    at android.app.Activity.performCreate(Activity.java:4465)
E/AndroidRuntime(20624):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
E/AndroidRuntime(20624):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
E/AndroidRuntime(20624):    ... 11 more

我用来拍照的代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageCaptureUri = Uri.fromFile(getTempImageFile());
intent.putExtra("return-data", true);
startActivityForResult(intent, INTENT_PICK_FROM_CAMERA);

裁剪图像的代码(在此意图的 onActivityResult 中):

Intent intent = new Intent("com.android.camera.action.CROP");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.ALTERNATIVE");
intent.addCategory("android.intent.category.SELECTED_ALTERNATIVE");
intent.setDataAndType(data.getData(), "image/jpeg");
intent.putExtra("outputX", CROPPED_IMAGE_X);
intent.putExtra("outputY", CROPPED_IMAGE_Y);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, INTENT_CROP_FROM_CAMERA);

似乎 data.getData() 为空,但我不确定。有谁知道可能是什么问题以及如何解决?

4

1 回答 1

0

我也遇到了裁剪功能(只有cooliris media)的问题:

Cooliris 媒体例外:

E/AndroidRuntime(4439): java.lang.RuntimeException: 
Unable to start activity ComponentInfo{com.cooliris.media/com.cooliris.media.CropImage}: java.lang.NullPointerException
...
E/AndroidRuntime(4439): Caused by: java.lang.NullPointerException
at com.cooliris.media.CropImage.onCreate(CropImage.java:276)

我通过为 ACTION_IMAGE_CAPTURE 意图提供正确的输出文件解决了这个问题。这对我有用:

private static Uri tempFileUri = null;
...
String fileName = "myImg.tmp";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION, "test description");
tempFileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (tempFileUri != null) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempFileUri); 
    ...
    startActivityForResult(takePictureIntent, IntentConstants.INTENT_REQUEST_CODE_TAKE_PHOTO);
}

我不再使用intent.putExtra("return-data", true);了,因为有些设备不返回数据(有些只有小图像 - 似乎每个设备的行为都不同)。也许这就是cooliris媒体中发生NullPointer Exception的原因(发送到cooliris的数据为空)。Cooliris 只是崩溃真的很烦人......

裁剪图像的代码(在此意图的 onActivityResult 中):

Uri picUri = null;
if (intent.getData() != null) {
    picUri = intent.getData();
} else {
    picUri = tempFileUri;
}
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(picUri, "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
cropIntent.putExtra("outputX", 56);
cropIntent.putExtra("outputY", 56);
cropIntent.putExtra("return-data", true);
startActivityForResult(cropIntent, INTENT_REQUEST_CODE_CROP_PHOTO);
于 2013-07-08T12:37:06.623 回答