마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

사진 촬영 후 크롭된 이미지 만들기

0 추천

현재사진촬영 버튼을 누르면

 

 private void doTakePhotoAction()
 {

   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   
   // 임시로 사용할 파일의 경로를 생성
   String url = "tmp_" + String.valueOf(System.currentTimeMillis()) + ".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);
   startActivity(intent);
 }

 

 
이 메소드로 가구요
 
촬영 후 크롭 화면을 가져오는데
 
 
 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", 90);
	        intent.putExtra("outputY", 90);
	        intent.putExtra("aspectX", 1);
	        intent.putExtra("aspectY", 1);
	        intent.putExtra("scale", true);
	        intent.putExtra("return-data", true);
	        startActivityForResult(intent, CROP_FROM_CAMERA);
	  
	        break;
	      }
	    }
	  }

 

 

case PICK_FROM_CAMERA:

 

이 부분이 사진 촬영뒤 크롭화면 가져오는 부분인데 

 

문제는 사진 촬영하고 나면 또 사진촬영화면이 나옵니다. 

그래서 사진을 두번 찍어야 크롭화면이 나옵니다.

반복호출은 없는거 같은데 어디를 으심해야 할까요

브루스웨인 (8,580 포인트) 님이 2013년 6월 13일 질문

1개의 답변

0 추천
 
채택된 답변
Break 를 의심해보세요
건방진프로그래머 (26,630 포인트) 님이 2013년 6월 14일 답변
브루스웨인님이 2013년 6월 18일 채택됨
감사합니다. 이제 두번 촬영이 안되네요
아 break가 있어서 사진찍고 다시 리퀘스트코드가서 사진촬영호출하고 그때 처음에 호출했던 크롭화면이 나오는거였나요?

break가 없으면 스위치문 내에서 바로 크롭호출로 가서 나오는거 같습니다.
어 다시 또 두번 찍어야 되네요 ;;
switch case 문에서 break가 어디에 있어야하는지 확인해보시길
올린 코드중에 break없는 부분은 앨범에서 사진 가져오는 부분처럼 보이는데요. 그래서 상관없는것 같고 올린 코드중에 이상은 안보이는데요. doTake함수가 중복호출 되지는 않나요? 로그넣어보세요..

그리고 카메라호출 인텐트에 crop설정주면 저렇게 2번에 걸쳐서 안받고 사진촬영후 어플안거치고 바로 crop화면으로 넘어갑니다.
private void doTakePhotoAction()
{
 
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
   
  // 임시로 사용할 파일의 경로를 생성
  String url = "tmp_" + String.valueOf(System.currentTimeMillis()) + ".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);
  startActivity(intent);
}
로그 찍고 생각해보니
혹시나 하고 마지막   startActivity(intent); 이구문을 지웠더니 한번만 호출 되네요.조언 감사합니다. intent를 호출하면 바로위에  startActivityForResult(intent, PICK_FROM_CAMERA); 이걸 또 호출해서 그런걸까요?
카메라 액티비티 2번 부르셨네요 당연히 2번 뜹니다 현재 저 코드에서는 forresult로 불러야하고 밑에 startactivity가 쓸데없는 코드입니다
...