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
이 블로그에서 짜집기한 소스인데요 카메라 촬영 및 이미지 크롭도 잘 되는데요... 문제는 촬영한 이미지와 크롭한 이미지파일이 안되서 문제네요.......
여기서 앨범선택을 누르면 이미지가 아무것도 없는데요... 어떻게 해야되죠???? 파일저장 경로를 잘못 줬나요?