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

카메라 이용한 호출 및 크롭인데요... 도와주세요..

0 추천
package com.example.project;
 
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
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.Toast;
import android.widget.ImageView;
 
public class SubActivity extends Activity implements OnClickListener {

	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 mPhotoImageView;
	private Button mButton;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);
        
        mButton = (Button)findViewById(R.id.button);
        mPhotoImageView = (ImageView)findViewById(R.id.image);
        
        mButton.setOnClickListener(this);
    }

    //앨범에서 이미지 가져오기
    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);
    }
    
    private void doTakeAlbumAction()
    {
    	Intent intent = new Intent(Intent.ACTION_PICK);
    	intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
    	startActivityForResult(intent, PICK_FROM_ALBUM);
    }
    
    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:
			{
				//처리가 카메라에서와 같음 나머지 생략
				mImageCaptureUri = data.getData();
				File original_file = getImageFile(mImageCaptureUri);
	             
				mImageCaptureUri = createSaveCropFile();
				File cpoy_file = new File(mImageCaptureUri.getPath()); 
		 
				// SD카드에 저장된 파일을 이미지 Crop을 위해 복사한다.
				copyFile(original_file , cpoy_file);
			}
			
			case PICK_FROM_CAMERA:
			{
				// 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다.
				// 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다.
	
				Intent intent = new Intent("com.android.camera.action.CROP");
				intent.setDataAndType(mImageCaptureUri, "image/*");
	
				intent.putExtra("outputX", 250);
				intent.putExtra("outputY", 250);
				intent.putExtra("aspectX", 1);
				intent.putExtra("aspectY", 1);
				intent.putExtra("scale", true);
				intent.putExtra("return-data", true);
	            intent.putExtra("output", mImageCaptureUri);
				startActivityForResult(intent, CROP_FROM_CAMERA);
				break;
			}
		}
	}
    //카피파일
    public static boolean copyFile(File srcFile, File destFile) {
        boolean result = false;
        try {
            InputStream in = new FileInputStream(srcFile);
            try {
                result = copyToFile(in, destFile);
            } finally  {
                in.close();
            }
        } catch (IOException e) {
            result = false;
        }
        return result;
    }
 
    private static boolean copyToFile(InputStream inputStream, File destFile) {
        try {
            OutputStream out = new FileOutputStream(destFile);
            try {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) >= 0) {
                    out.write(buffer, 0, bytesRead);
                }
            } finally {
                out.close();
            }
            return true;
        } catch (IOException e) {
            return false;
        }
    }
    
    private File getImageFile(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        if (uri == null) {
            uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        }
 
        Cursor mCursor = getContentResolver().query(uri, projection, null, null, 
                MediaStore.Images.Media.DATE_MODIFIED + " desc");
        if(mCursor == null || mCursor.getCount() < 1) {
            return null; // no cursor or no record
        }
        int column_index = mCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        mCursor.moveToFirst();
 
        String path = mCursor.getString(column_index);
 
        if (mCursor !=null ) {
            mCursor.close();
            mCursor = null;
        }
 
        return new File(path);
    }
    private Uri createSaveCropFile(){
        Uri uri;
        String url = "tmp_" + String.valueOf(System.currentTimeMillis()) + ".jpg";
        uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), url));
        return uri;
    }
    //이미지 크롭
    /*
	private void storeCropImage(Bitmap bitmap, String filePath) {
    	File copyFile = new File(filePath);
    	BufferedOutputStream out = null;

    	try {
    	copyFile.createNewFile();
    	out = new BufferedOutputStream(new FileOutputStream(copyFile));
    	bitmap.compress(CompressFormat.JPEG, 100, out);
    	out.flush();
    	out.close();
    	} catch (Exception e) {         
    	e.printStackTrace();
    	}
    }*/
    public void onClick(View v)
    {
    	DialogInterface.OnClickListener cameraListener = new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				doTakePhotoAction();
			}
		};
		
		DialogInterface.OnClickListener albumListener = new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				doTakeAlbumAction();
			}
		};
		
		DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				dialog.dismiss();
			}
		};
		
		new AlertDialog.Builder(this)
		.setTitle("업로드할 이미지 선택")
		.setPositiveButton("사진촬영", cameraListener)
		.setNeutralButton("앨범선택", albumListener)
		.setNegativeButton("취소", cancelListener)
		.show();
		
    }
}

http://arabiannight.tistory.com/45

http://theeye.pe.kr/archives/1285

이 블로그에서 짜집기한 소스인데요 카메라 촬영 및 이미지 크롭도 잘 되는데요... 문제는 촬영한 이미지와 크롭한 이미지파일이 안되서 문제네요.......

여기서 앨범선택을 누르면 이미지가 아무것도 없는데요... 어떻게 해야되죠???? 파일저장 경로를 잘못 줬나요?

우억쇼 (120 포인트) 님이 2014년 4월 13일 질문
실제 파일로 존재하는지 확인해보세요.
있다면 답변자님 말씀처럼 미디어 스캔이 되지 않아서 그렇습니다.
또는 DB에 직접 밀어 넣을 수도 있습니다.

1개의 답변

+1 추천
아무래도 카메라나 크롭쪽 문제가 아니라 새로 찍은 사진 혹은 크롭한 파일에 대해

미디어 스캔을 안하셔서 앨범에 안나오는게 아닐까 합니다.

파일 생성 후 미디어 스캔을 해보세요.

http://stackoverflow.com/questions/13270789/how-to-run-media-scanner-in-android
사악미소 (65,330 포인트) 님이 2014년 4월 14일 답변
...