Android应用程序在自定义列表视图中添加图像时崩溃
我正在制作自定义列表视图,其中我必须添加用户从sd卡或相机拍摄的图像。为此,我拍摄了一个图像视图和两个按钮。一个按钮从相机拍摄照片,另一个按钮从sd卡拍摄照片,然后他们在图像视图中添加照片。现在,当我在自定义中传递该图像uri时列表视图,然后第一次添加图像,但第二次应用程序崩溃…如果有人知道答案,请发布它。 提前谢谢 这是代码。 这是用来点击按钮的Android应用程序在自定义列表视图中添加图像时崩溃,android,android-listview,camera,out-of-memory,Android,Android Listview,Camera,Out Of Memory,我正在制作自定义列表视图,其中我必须添加用户从sd卡或相机拍摄的图像。为此,我拍摄了一个图像视图和两个按钮。一个按钮从相机拍摄照片,另一个按钮从sd卡拍摄照片,然后他们在图像视图中添加照片。现在,当我在自定义中传递该图像uri时列表视图,然后第一次添加图像,但第二次应用程序崩溃…如果有人知道答案,请发布它。 提前谢谢 这是代码。 这是用来点击按钮的 camera.setOnClickListener(new View.OnClickListener() { @Overr
camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
Environment.getExternalStorageDirectory(), "temp.jpg")));
startActivityForResult(intent, 2);
}
});
sdcard.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
startActivityForResult(i, 0);
}
});
adapter = new SimpleAdapter(
this,
list12,
R.layout.list_row_1,
new String[] { "name", "address", "location", "image" },
new int[] { R.id.name, R.id.address, R.id.location, R.id.image });
setListAdapter(adapter);
在这之后
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2) {
File picture = new File(Environment.getExternalStorageDirectory()
+ "/temp.jpg");
imgUri = Uri.fromFile(picture);
targetImage.setImageURI(imgUri);
location1 = "Camera";
}
else {
if (resultCode == RESULT_OK) {
targetUri = data.getData();
textTargetUri.setText(targetUri.toString());
try {
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(targetUri));
//decodeBitmap(bitmap, 4, 4);
targetImage.setImageBitmap(bitmap);
location1 = "Sd card";
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后我在列表视图中添加图像
private void populateList() {
HashMap<String, Object> temp11 = new HashMap<String, Object>();
name1 = textname.getText().toString();
address1 = textaddress.getText().toString();
if (name1.equals("") || address1.equals("")) {
String str = "Don't Leave field blank !";
Toast toast = Toast.makeText(LastPage.this,
str, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
else if (location1 == "Sd card") {
textname.setText("");
textaddress.setText("");
temp11.put("name", name1);
temp11.put("address", address1);
temp11.put("location", location1);
temp11.put("image", targetUri);
targetImage.setImageBitmap(null);
list12.add(0, temp11);
adapter.notifyDataSetChanged();
} else if (location1 == "Camera") {
textname.setText("");
textaddress.setText("");
temp11.put("name", name1);
temp11.put("address", address1);
temp11.put("location", location1);
temp11.put("image", imgUri);
targetImage.setImageBitmap(null);
list12.add(0, temp11);
adapter.notifyDataSetChanged();
}
从相机上拍摄的大图像?尝试减小该图像的大小(降低相机设置中的分辨率) 看起来您已超出应用程序的可用内存: 从您发布的日志中:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
但除此之外,您可能正在泄漏一些内存。你应该丢弃(回收)那些位图等
@DigCamara在他/她的答案中发布了一些优秀的链接!真的,对于你的处境,这是一本必读的书。你读过吗
特别是,您需要了解如何使用。在加载位图之前,您应该尝试验证需要使用哪些选项来缩小其大小,例如
可能有助于您在尝试加载图像之前重新缩放图像所需的代码 编辑您的帖子,包括您正在使用的代码,以及正在放入logcat的异常。如果没有这些信息,我们就无法帮助你。@FoamyGuy..我已经添加了我的代码。请看一看,你也可以添加日志吗?@DigCamara…非常感谢..如果答案有帮助,我建议对答案进行投票,尤其是DigCamara的。@Mattias谢谢你的想法。但我认为他还不能放弃答案。
java.lang.OutOfMemoryError: bitmap size exceeds VM budget