package co.kr.cube.activity;

import java.io.File;

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.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import co.kr.cube.R;
import co.kr.cube.layout.DeMoTitleBar;
import co.kr.cube.layout.DemoTaskBar;
import co.kr.cube.utils.Util;

public class PhotoSiteValue extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
 
 Activity act = this;
 Util cmsutil = new Util(act);
 
 private static final int PICK_FROM_CAMERA = 0;
 private static final int PICK_FROM_ALBUM = 1;
 private static final int CROP_FROM_CAMERA = 2;
 
 private Uri mImageCaptureUri;
 private ImageView imgvPhotoView;
 private ImageButton ibtnphotoAdd;
 
 String TAG = "PhotoSiteValue";
 
 ImageButton ibtnconfirm;
 ImageButton ibtncancel;
 ImageButton ibtnphotolocation;
 ImageButton ibtnphotoday;


 TextView tvphotoday;
 
 DeMoTitleBar tt;
 DemoTaskBar tb;
 
 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
 {       
  // 뒤로 가기 버튼 처리. 1.6버전을 호환하기 위해 작성
     if ((keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) && event.getRepeatCount() == 0)
     {         
      cmsutil.goActivity(act, act.getPackageName() + Util.PHOTOSITE);
   act.finish();
      return true;
     }        
     else
      return super.onKeyDown(keyCode, event);  
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.photositemain);
       
        Intent intent = getIntent();
        init();
       
        ibtnphotoAdd  = (ImageButton)findViewById(R.id.ibtn_photosite_photo);
        ibtnphotolocation = (ImageButton)findViewById(R.id.ibtn_photosite_loca);
        ibtnphotoday = (ImageButton)findViewById(R.id.ibtn_photosite_days);
        tvphotoday = (TextView)findViewById(R.id.tvphotosite_days_value);
      
        imgvPhotoView = (ImageView)findViewById(R.id.ivphotosite_photoview);
       
        ibtnphotoAdd.setOnClickListener(this);
       
        ibtnphotolocation.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {

   }
  });
       
        ibtnphotoday.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(PhotoSiteValue.this, DemoTwoBtnDialogBox.class);
    intent.putExtra("sentence",0);
    intent.putExtra("setdate", 1);
    intent.putExtra("setinput",0);
    Log.i(TAG, "call activity");
    startActivityForResult(intent, Util.POPUP_ANSWER); 
    
   }
  });
       
        ibtnconfirm = (ImageButton)findViewById(R.id.photosite_confirmbtn);
        ibtnconfirm.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
       cmsutil.goActivity(act, act.getPackageName() + Util.PHOTOSITE);
    act.finish();
    
   }
  });
       
  ibtncancel = (ImageButton)findViewById(R.id.photosite_cancelbtn);
  ibtncancel.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
       cmsutil.goActivity(act, act.getPackageName() + Util.PHOTOSITE);
    act.finish();
   }
  });
    }
   
    @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data)
 {
  super.onActivityResult(requestCode, resultCode, data);
  Log.i(TAG, "Camera Datas ::::::" + requestCode +  resultCode);
  if(resultCode == RESULT_OK) // 액티비티가 정상적으로 종료되었을 경우
  {
   if(requestCode == Util.POPUP_ANSWER)
   {
    if(data.getStringExtra("popup_answer").equals("ok"))
    {
     if(data.getIntExtra("setdate", 0) == 1)
     {
      Log.i(TAG, "set date what : [[ " +data.getStringExtra("popup_year") +
      data.getStringExtra("popup_month") +
      data.getStringExtra("popup_day") + "]]");
      
      tvphotoday.setText(data.getStringExtra("popup_year") + "년 " +
        data.getStringExtra("popup_month") + "월 " +
        data.getStringExtra("popup_day") + "일");
      
     }
    }
   }
   else if(requestCode == Util.POPUP_DISAPPEAR)
   {
    Log.i(TAG, "POPUP_DISAPPEAR>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    if(data.getStringExtra("popup_disappear").equals("yes"))
    {
     Log.i(TAG, "popup_disappear yes>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

     
    }
   }
   
   switch(requestCode)
   {
    case CROP_FROM_CAMERA:
    {
     // 크롭이 된 이후의 이미지를 넘겨 받습니다. 이미지뷰에 이미지를 보여준다거나 부가적인 작업 이후에
     // 임시 파일을 삭제합니다.
     if(mImageCaptureUri != null)
     {
      imgvPhotoView.setImageURI(mImageCaptureUri);
     }
     
     
     /*final Bundle extras = data.getExtras();
  
     if(extras != null)
     {
      Bitmap photo = extras.getParcelable("data");
      imgvPhotoView.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", 440);
     intent.putExtra("outputY", 260);
     intent.putExtra("aspectX", 1);
     intent.putExtra("aspectY", 1);
     intent.putExtra("scale", true);
     intent.putExtra("return-data", true);
     startActivityForResult(intent, CROP_FROM_CAMERA);
  
     break;
    }
   }
  }
 }
   
    public void init()
 {   
  tt = new DeMoTitleBar(this);
  tt.init(R.string.photosite_title);
  
  tb = new DemoTaskBar(this);
  tb.init();
 }
   
    private void doTakePhotoAction()
 {
  /*
   * 참고 해볼곳
   * http://2009.hfoss.org/Tutorial:Camera_and_Gallery_Demo
   * http://stackoverflow.com/questions/1050297/how-to-get-the-url-of-the-captured-image
   * http://www.damonkohler.com/2009/02/android-recipes.html
   * http://www.firstclown.us/tag/android/
   */

  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);
 }
   
    /**
  * 앨범에서 이미지 가져오기
  */
 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
 public void onClick(View v) {
  {
   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();
  }
 }
}

테스트단말은 갤럭시 탭입니다.

기본 카메라 기능을 이용해 사진을 촬영하고 촬영한 사진을 크롭해 콤포넌트에다 넣는 소스입니다.

넥서스 원에서는 이상없엇는데

갤럭시 단말에서는 사진 촬영후 프리뷰 화면이  세로 일 경우 저장버튼을 누르면 크롭화면으로 넘어 가지 않고  갤러리 앱이 예상치 못한 오류로 종료 된다고 뜨네요

이거 해결할 방법이 없을까요? 고수님들 도와주세요!