我尝试编写一些相机意图处理程序来拍照并对其进行后期处理(如果需要)。如果我以高分辨率拍摄一些照片,我的程序会因“分配太大”而中断。如果我拿一些分辨率较低的东西,我可以拿更多,但它也会坏掉。经过一番搜索,我发现我必须回收手动制作的位图。但问题并没有消失。我的主要问题是我不知道 1. 我的代码中是否存在内存泄漏 2. 我不知道为什么它试图分配内存,因为我没有在我的程序中显示位图(现在) ,我只是保存它们以供进一步重复使用。
public void onClick(View view) {
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
this.mLastPic = new File(this.mFs.getDirPath(), this.mFs.getNextPicName()); //create and save a file for pic
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.mLastPic));
this.startActivityForResult(i, 0);
}
on 活动结果处理程序
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK && requestCode == 0) {
try {
if(!this.mController.getSetting(R.string.USE_HEIGH_RESOLUTION)) { //use high res or not
int quality = this.mFs.getPicQuality(); //get compress quality
Bitmap pic = BitmapFactory.decodeFile(this.mLastPic.getPath());
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
pic.compress(Bitmap.CompressFormat.JPEG, quality, outStream);
String path = this.mLastPic.getPath();
if(this.mLastPic.delete()) { //replace the old file with a now file
File newFile = new File(path);
newFile.createNewFile();
FileOutputStream os = new FileOutputStream(newFile);
os.write(outStream.toByteArray());
Log.d("newEntryActivity.onActivityResult", "replaced pic ");
} else {
Log.d("newEntryActivity.onActivityResult", "cant delete old pic");
}
pic.recycle(); //cleaning up
outStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
logcat 显示
05-09 14:35:01.694: E/dalvikvm-heap(845): 6380496 字节的外部分配对于这个进程来说太大了。05-09 14:35:01.694: E/(845): VM 不允许我们分配 6380496 字节
05-09 14:35:01.694: D/AndroidRuntime(845): 关闭 VM
05-09 14:35:01.694: W/dalvikvm(845): threadid=3: 线程以未捕获的异常退出 (group=0x4001b188)
05-09 14:35:01.694:E/AndroidRuntime(845):未捕获的处理程序:线程主因未捕获的异常而退出
05-09 14:35:01.714: E/AndroidRuntime(845): java.lang.RuntimeException: 无法启动活动 ComponentInfo{unicorn.Heurazio/unicorn.Heurazio.SettingsActivity}: android.view.InflateException: 二进制 XML 文件行# 2:膨胀类错误......
05-09 14:35:01.714: E/AndroidRuntime(845): 由: android.view.InflateException: Binary XML file line #2: Error inflating class
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.createView(LayoutInflater.java:513)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:385)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:320)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:276)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.app.Activity.setContentView(Activity.java:1622)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 unicorn.Heurazio.SettingsActivity.onCreate(SettingsActivity.java:38)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
05-09 14:35:01.714: E/AndroidRuntime(845): ... 11 更多
05-09 14:35:01.714:E/AndroidRuntime(845):由:java.lang.reflect.InvocationTargetException 引起
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.widget.LinearLayout.(LinearLayout.java:92)
05-09 14:35:01.714: E/AndroidRuntime(845): at java.lang.reflect.Constructor.constructNative(Native Method)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 java.lang.reflect.Constructor.newInstance(Constructor.java:446)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.LayoutInflater.createView(LayoutInflater.java:500)
05-09 14:35:01.714: E/AndroidRuntime(845): ... 21 更多
05-09 14:35:01.714:E/AndroidRuntime(845):原因:java.lang.OutOfMemoryError:位图大小超出 VM 预算
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.Bitmap.nativeCreate(Native Method) > 05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics。 Bitmap.createBitmap(Bitmap.java:468)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.Bitmap.createBitmap(Bitmap.java:435)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.content.res.Resources.loadDrawable(Resources.java:1705)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.content.res.TypedArray.getDrawable(TypedArray.java:548)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.View.(View.java:1850)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.View.(View.java:1799)
05-09 14:35:01.714: E/AndroidRuntime(845): 在 android.view.ViewGroup.(ViewGroup.java:284)
任何帮助都会很棒。
问候亚历克斯