킷캣
-
안드로이드 킷캣에서 사진 자르기시 팅기는 현상 임시 해결..?2014.12.15
안드로이드 킷캣에서 사진 자르기시 팅기는 현상 임시 해결..?
그냥 간단하게 사진 자르기 해서 이미지 넣으려고 했는데
킷캣에서 부터 팅기는 현상이 발생했다.
팅기는 영상.
정말 뜬금없다. 킷캣 전부터는 쭉 잘 되던거였는데...
웃긴 건 이상하게 특정사진만 자르면 팅긴다. 원본사진은 100kb밖에 안되는 사진인데도 말이다.
도대체 원인 뭔지 한참을 찾아헤맸다.
어찌어찌 해결을 됐는데 완벽한 해결책은 아니다..
킷캣문제인가 해서 찾아보기도 하고..
참고한 링크들이다.
https://plus.google.com/112692779577336772166/posts/9MbmSsUcd1e
http://www.androidside.com/plugin/mobile/board.php?bo_table=B49&wr_id=81704
안드로이드 사이드 위 글을 보고 해결을 했다.
사진 크롭 코드를 보면 이런 부분이 있다.
기존 코드는 이렇게 되어있었는데
intent.putExtra("outputX", 120);
intent.putExtra("outputY", 130);
안드로이드사이드 글에서 이게 문제라는 댓글을 보았다.
그래서 저 숫자를
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
100로 작게 바꿔주었다.
그랬더니?? 신기하게 팅기지가 않는다. 최소한 내 폰에서는...
그래서 임시방편으로나마 해결을 했는데 찜찜하다.
다른 폰에서는 자르기는 되는데 자른 이미지가 깨진건지 안나온다;;;
찾아보면서 얻은 결론은
메모리 부족으로 발생하는 것이다.
바인더 Intent에 1MB 이상의 데이터를 넘기게되면 발생할 수 있다.
보통 제공되는 크롭을 사용하게 되면 발생하므로 이미지 크롭의 경우 직접 구현해서 사용하는게 낫다는 의견
하지만 직접 구현할 능력이..;; 그리고 찾아본 예제들은 거의 다 기본 제공 크롭소스이다..
마지막으로 위 영상의 예제 코드를 올린다.
아마도 다 이 코드를 쓸 것이다. 퍼질대로 퍼진 대중적인 코드(xml은 제외)
package com.example.camera import java.io.File; import com.example.camera.R; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends Activity implements OnClickListener { private ImageView mPhotoImageView;// 이미지 받기 private ImageView foot; private Uri mImageCaptureUri; private static final int PICK_FROM_CAMERA = 0; private static final int PICK_FROM_ALBUM = 1; private static final int CROP_FROM_CAMERA = 2; LinearLayout bar, mother = null; FrameLayout container = null; Bitmap bm = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button mButton = (Button) findViewById(R.id.load); mPhotoImageView = (ImageView) findViewById(R.id.profile); mButton.setOnClickListener(this); } private void doTakePhotoAction() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 임시로 사용할 파일의 경로를 생성 String url = "tmp.jpg"; mImageCaptureUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory(), url)); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); // 특정기기에서 사진을 저장못하는 문제가 있어 다음을 주석처리 합니다. // intent.putExtra("return-data", true); startActivityForResult(intent, PICK_FROM_CAMERA); } private void doTakeAlbumAction() { // 앨범 호출 Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE); startActivityForResult(intent, PICK_FROM_ALBUM); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } switch (requestCode) { case CROP_FROM_CAMERA: { // 크롭이 된 이후의 이미지를 넘겨 받습니다. // 이미지뷰에 이미지를 보여준다거나 부가적인 작업 이후에 // 임시 파일을 삭제합니다. final Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); mPhotoImageView.setImageBitmap(photo); } // 임시 파일 삭제 File f = new File(mImageCaptureUri.getPath()); if (f.exists()) { f.delete(); } break; } case PICK_FROM_ALBUM: { // 이후의 처리가 카메라와 같으므로 일단 break없이 진행합니다. // 실제 코드에서는 좀더 합리적인 방법을 선택하시기 바랍니다. mImageCaptureUri = data.getData(); } case PICK_FROM_CAMERA: { // 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다. // 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다. Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageCaptureUri, "image/*"); intent.putExtra("outputX", 120); intent.putExtra("outputY", 130); // intent.putExtra("aspectX", 1); // intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_FROM_CAMERA); break; } } } @Override public void onClick(View v) { if (v.getId() == R.id.load) { DialogInterface.OnClickListener cameraListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { doTakePhotoAction(); } }; DialogInterface.OnClickListener albumListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { doTakeAlbumAction(); } }; DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }; new AlertDialog.Builder(this).setTitle("업로드할 이미지 선택") .setPositiveButton("사진촬영", cameraListener) .setNeutralButton("앨범선택", albumListener) .setNegativeButton("취소", cancelListener).show(); } } }
팅길 때 찍힌 로그.
12-14 20:59:51.831: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!! 12-14 20:59:51.831: I/ActivityManager(1242): Restarting because process died: ActivityRecord{42d64570 u0 com.example.camera/.MainActivity t1511} 12-14 20:59:51.831: D/AlwaysOnTopManagerService(1242): setRearTouchLongPress(): flag = false, mIsLongPress = false 12-14 20:59:51.851: W/WindowManager(1242): view not successfully added to wm, removing view 12-14 20:59:51.861: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!! 12-14 20:59:51.861: W/ActivityManager(1242): Exception when starting activity com.example.camera/.MainActivity 12-14 20:59:51.861: W/ActivityManager(1242): android.os.TransactionTooLargeException 12-14 20:59:51.861: W/ActivityManager(1242): at android.os.BinderProxy.transact(Native Method) 12-14 20:59:51.861: W/ActivityManager(1242): at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:761) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1072) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1168) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.resumeTopActivityLockedInner(ActivityStack.java:2327) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1482) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked(ActivityStackSupervisor.java:2196) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1077) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:964) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:5364) 12-14 20:59:51.861: W/ActivityManager(1242): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:427) 12-14 20:59:51.861: W/ActivityManager(1242): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2159) 12-14 20:59:51.861: W/ActivityManager(1242): at android.os.Binder.execTransact(Binder.java:404) 12-14 20:59:51.861: W/ActivityManager(1242): at dalvik.system.NativeStart.run(Native Method) 12-14 20:59:51.872: D/WindowManager(1242): win:Window{435b3a88 u0 com.example.camera/com.example.camera.MainActivity}mOemFlagWin:null,mSaveOemFlags:0,mCurrentFocus:Window{449c9898 u0 com.android.gallery3d/com.android.gallery3d.filtershow.crop.CropActivity} 12-14 20:59:51.882: I/ActivityManager(1242): Start proc com.example.camera for activity com.example.camera/.MainActivity: pid=6109 uid=10007 gids={50007} 12-14 20:59:51.882: D/ActivityManager(1242): checkHideDockBarApplication.result = NOK 12-14 20:59:51.892: D/dalvikvm(6109): Late-enabling CheckJNI 12-14 20:59:51.922: D/dalvikvm(6109): Debugger has detached; object registry had 1 entries 12-14 20:59:51.922: E/JavaBinder(1242): !!! FAILED BINDER TRANSACTION !!! |
위 로그를 보고 어느 분이 달아주신 댓글..
TransactionTooLargeException 발생한거네요..
바인더 Intent에 1MB 이상의 데이터를 넘기게되면 발생할 수 있습니다.
보통 제공되는 크롭을 사용하게 되면 발생하구요.. 이미지 크롭의 경우 직접 구현해서 사용하는게 낫습니다.
나중에 좀 더 완벽한 해결책을 적용할 수 있으면 좋겠다.
'지식메모 > 안드로이드 Android' 카테고리의 다른 글
안드로이드 Android library projects cannot be launched 에러 발생 해결책 (0) | 2015.01.31 |
---|---|
안드로이드 Unable to start activity ComponentInfo 문제해결 (0) | 2015.01.31 |
안드로이드 R.java 파일 없어졌을 때 해결법 (2) | 2014.09.05 |
안드로이드 graphical Layout 안 뜨는 문제해결 (7) | 2014.08.10 |
안드로이드 conversion to Dalvik format failed with error 1 문제해결.. (2) | 2014.07.27 |