2012-10-23 4 views
4

문제점/문제가 있습니다. 몇 주 동안 검색했지만 아직 해결 방법이 없습니다. 이 앱은 내부에 프레임이있는 사진을 찍기위한 앱입니다. 프레임이 PNG에 있습니다.java.lang.OutOfMemoryError 카메라 앱

언제든지 앱을 시작하면 멋지게 나오지만 단추를 클릭하여 사진을 찍으면 앱이 다운됩니다. 때로는 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

코드 디버깅을 시도 했습니까? OutOfMemoryError를 일으킬 수있는 아이디어가 있습니까? StackOverflow의 사용자가 다른 사람의 코드를 무료로 디버깅하는 것을 너무나 많은 사람들이 생각하는 것을 놀랍게 생각합니다. – CKing

답변

1

하나의 문제입니다 : decodeByteArray (바이트 [] 데이터, int 오프셋, int 길이)

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

10 점의 오프셋이 무엇인지 모르겠지만 길이를 수정해야합니다.

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

실제로 내가 0을 넣으면 메모리 오류가 발생하고 10을 넣으면 다른 하나를 얻습니다. – MobiusApps

관련 문제