Java.lang.OutOfMemoryError Приложение для камеры

У меня проблема/проблема, я искал пару недель и до сих пор не решил. это приложение для фотографирования с рамкой внутри него. рамка находится в PNG.

Когда я запускаю приложение, все происходит отлично, но когда я нажимаю кнопку, чтобы сделать снимок, приложение падает. иногда он дает OutOfMemoryError, а иногда и ArrayIndexOutOfBoundsException, поэтому я пробовал почти все и все же ничего. я должен изменить размер drawbles? или я должен установить размер финального BMP?

Прошу прощения за мой английский, так как я французский. вот код

private class CapturePictureCallback implements PictureCallback {
 @Override
 public void onPictureTaken(byte[] data, Camera camera) {
 Bitmap picBitmap = BitmapFactory.decodeByteArray(data, 10,
 data.length);
 final ViewFlipper flipper = (ViewFlipper) findViewById(R.id.main_flipper);
 View flipperView = flipper.getCurrentView();
 Bitmap flipperBitmap = Bitmap.createBitmap(flipperView.getWidth(), flipperView.getHeight(), Bitmap.Config.ARGB_4444);
 Canvas flipperCanvas = new Canvas(flipperBitmap);
 flipperView.draw(flipperCanvas);
 Bitmap resizedFlipperBitmap = Bitmap.createScaledBitmap(flipperBitmap, 500, 300, true);
 // Insert image on top
 Bitmap overlaidBitmap = overlay(picBitmap, resizedFlipperBitmap);
 picBitmap.recycle();
 resizedFlipperBitmap.recycle();
 // Create file
 save(overlaidBitmap);
 overlaidBitmap.recycle();
 camera.startPreview();
 }
 private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
 Bitmap bmOverlay = Bitmap.createBitmap( 0,0, bmp1.getConfig());
 Canvas canvas = new Canvas(bmOverlay);
 canvas.drawBitmap(bmp1, new Matrix(), null);
 canvas.drawBitmap(bmp2, new Matrix(), null);
 return bmOverlay;
 }
 private void save(Bitmap bitmap) {
 File picturesFolder = null;
 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
 picturesFolder = new File(
 Environment.getExternalStorageDirectory(), "Pictures");
 } else {
 picturesFolder = Environment
 .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
 }
 Date date = new Date(System.currentTimeMillis());
 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
 String dateString = sdf.format(date);
 String fileName = "kissthepresident" + dateString + ".jpeg";
 File pictureFile = new File(picturesFolder, fileName);
 try {
 FileOutputStream fos = new FileOutputStream(pictureFile);
 BufferedOutputStream bos = new BufferedOutputStream(fos);
 bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bos);
 bitmap.recycle();
 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1) {
 ContentValues values = new ContentValues(7);
 values.put(Images.Media.TITLE, fileName);
 values.put(Images.Media.DISPLAY_NAME, fileName);
 values.put(Images.Media.DATE_TAKEN, dateString);
 values.put(Images.Media.MIME_TYPE, "image/jpeg");
 values.put(Images.Media.ORIENTATION, 0);
 values.put(Images.Media.DATA,
 pictureFile.toString());
 values.put(Images.Media.SIZE, pictureFile.length());
 Uri uri = Uri.fromFile(pictureFile);
 getContentResolver().insert(uri, values);
 } else {
 MediaScannerConnection.scanFile(getApplicationContext(),
 new String[] { pictureFile.toString() }, null,
 new MediaScannerConnection.OnScanCompletedListener() {
 public void onScanCompleted(String path, Uri uri) {
 Log.i("ExternalStorage", "Scanned " + path + ":");
 Log.i("ExternalStorage", "-> uri=" + uri);
 }
 });
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
}
@Override
protected void onDestroy() {
 super.onDestroy();
 unbindDrawables(findViewById(R.id.main_layout));
 System.gc();
}
private void unbindDrawables(View view) {
 if (view.getBackground() != null) {
 view.getBackground().setCallback(null);
 }
 if (view instanceof View) {
 for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
 unbindDrawables(((ViewGroup) view).getChildAt(i));
 }
 ((ViewGroup) view).removeAllViews();
 }
}

и вот catlog

FATAL EXCEPTION: main java.lang.ArrayIndexOutOfBoundsException
at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:403)
at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
at com.kissthepresidents.Main$CapturePictureCallback.onPictureTaken(Main.java:255)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:529)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3701)
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:862)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
at dalvik.system.NativeStart.main(Native Method)
1 ответ

Одна проблема: decodeByteArray (byte [] data, int offset, int length)

Bitmap picBitmap = BitmapFactory.decodeByteArray(data, 10,
 data.length);

Должно быть (я не знаю, что такое смещение 10, но вы должны исправить длину).

Bitmap picBitmap = BitmapFactory.decodeByteArray(data, 10,
 data.length - 10);

licensed under cc by-sa 3.0 with attribution.