在我的应用程序中,我点击一个名为Pick Photo的按钮,然后加载图库。当我单击图库中的图像时,应用程序强制关闭,在我的logcat中,我收到以下内容:
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/3369 (has extras) }} to activity {cap.shot/cap.shot.LolcatActivity}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:2655)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:2697)
at android.app.ActivityThread.access$2000(ActivityThread.java:124)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at cap.shot.LolcatView.loadFromUri(LolcatView.java:137)
at cap.shot.LolcatActivity.loadPhoto(LolcatActivity.java:384)
at cap.shot.LolcatActivity.onActivityResult(LolcatActivity.java:299)
at android.app.Activity.dispatchActivityResult(Activity.java:3988)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2651)
我的lolcatactivity.java可在此处找到:http://pastebin.com/AVL8CswT 我的lolcatview.java可以在这里找到:http://pastebin.com/vD7vCBgY
谢谢!
答案 0 :(得分:3)
getDrawable
在您的情况下返回null。
您用于setImageURI
的uri可能无效,因此您将无效。
对drawable进行空检查,如果drawable为null,则需要保释。
编辑:
if(drawable == null)
return;
答案 1 :(得分:1)
我检查了你的代码,所以我认为你需要像这样替换你的按钮动作
private static final int SELECT_PHOTO = 100
Intent photoPickerIntent = new Intent(
Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
并在您的开始活动结果中提供
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
System.out.println("requestcode" + requestCode + "result code "
+ requestCode + "intentt" + imageReturnedIntent);
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case SELECT_PHOTO:
if (resultCode == RESULT_OK) {
// InputStream imageStream;
try {
Uri selectedImage = imageReturnedIntent.getData();
Bitmap yourSelectedImage = decodeUri(selectedImage);
// imageStream = getContentResolver().openInputStream(
// selectedImage);
// Bitmap yourSelectedImage = BitmapFactory
// .decodeStream(imageStream);
try {
yourimageview.setImageBitmap(yourSelectedImage);
picArray = convertBitmap(yourSelectedImage);
String imagepath_new = getRealPathFromURI(selectedImage);
System.out.println("gakk" + imagepath_new);
String[] s = imagepath_new.split("/");
System.out.println(s[s.length - 1]);
String imageName1 = s[s.length - 1];
imageName1 = imageName1.replace(" ", "");
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
"Exception" + e, 1000).show();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
并且还添加这些行以避免在活动中显示图像视图时的内存泄漏。
private byte[] convertBitmap(Bitmap bm) {
// int bytes = bm.getWidth() * bm.getHeight() * 4; // calculate how many
// bytes our image
// consists of. Use a
// different value than
// 4 if you don't use
// 32bit images.
// ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new
// buffer
// bm.copyPixelsToBuffer(buffer); // Move the byte data to the buffer
// byte[] array = buffer.array(); // Get the underlying array containing
// the data.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] array = stream.toByteArray();
return array;
}
private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(
getContentResolver().openInputStream(selectedImage), null, o);
// The new size we want to scale to
final int REQUIRED_SIZE = 140;
// Find the correct scale value. It should be the power of 2.
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 3;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(
getContentResolver().openInputStream(selectedImage), null, o2);
}
public String getRealPathFromURI(Uri contentUri) {
// can post image
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, // Which columns to
// return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private Bitmap decodeFile(File f) {
Bitmap b = null;
try {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream fis = new FileInputStream(f);
BitmapFactory.decodeStream(fis, null, o);
fis.close();
int scale = 10;
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
fis = new FileInputStream(f);
b = BitmapFactory.decodeStream(fis, null, o2);
fis.close();
} catch (IOException e) {
}
return b;
}
希望这会帮助你