|
안드로이드(Android) 카메라, 갤러리 호출후 이미지 잘래내서 화면에 표시 |
|
환경 : Eclipse Mars, Android 4.2.2 |
이번예제는 안드로이드에 내장된 카메라와 갤러리 프로그램을 호출해서 이미지를 선택한후 잘라내게 합니다. 잘라낸 이미지를 리턴받아 메인 화면에 표시해 주게 됩니다. 이미지를 잘라내는 옵션을 카메라와 갤러리 프로그램을 Intent 로 호출할 때 적용할수 있습니다.
▶ 샘플은 2가지 버튼이 있는데 카메라 호출하는 것과 갤러리 호출입니다. 카메라는 찍고 나서 메인에서 호출할 때 셋팅했던 잘라내기 크기 만큼 이미지를 리턴하게 됩니다. 카메라 호출 하는 소스와 잘라내기 옵션을 지정하기 위한 셋팅값은 다음과 같습니다.
// 카메라 호출
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
// 이미지 잘라내기 위한 크기
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 0);
intent.putExtra("aspectY", 0);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 150);
▶ 이렇게 셋팅한후 startActivityForResult() 함수를 호출합니다. startActivityForResult() 함수를 호출하는 것은 리턴값을 받기 위함입니다. 프로그램을 호출하고 완료하면 onActivityResult() 함수가 호출되면서 결과 값을 받을 수 있는 것이죠.
try {
intent.putExtra("return-data", true);
startActivityForResult(Intent.createChooser(intent,
"Complete action using"), PICK_FROM_GALLERY);
} catch (ActivityNotFoundException e) {
// Do nothing for now
}
▶ startActivityForResult() 호출하였으므로 카메라 프로그램이 호출되어 사진찍고 이미지를 잘라낸후 확인을 누르면 그 결과값이 onActivityResult() 리턴되는데 이곳에 넘어온 Intent 데이터가 결과 값이 되는 것입니다. 카메라에서 넘어온 것이므로 Bitmap 이겠죠.받은 데이터를 화면 ImageView 에 셋팅합니다. onActivityResult() 에서 리턴값으로 넘어오는 requestCode 는 구분자가 되는데 startActivityForResult() 값을 호출할 때 두분째 인수가 됩니다.
protected void onActivityResult(int requestCode,
int resultCode,
Intent data) {
if (requestCode == PICK_FROM_CAMERA) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
imgview.setImageBitmap(photo);
}
}
if (requestCode == PICK_FROM_GALLERY) {
Bundle extras2 = data.getExtras();
if (extras2 != null) {
Bitmap photo = extras2.getParcelable("data");
imgview.setImageBitmap(photo);
}
}
}
▶ 두번째 버튼인 갤러리에서 가져오기도 카메라에서 가져오기와 별다른 차이는 없습니다. Intent 에 값을 셋팅한후 프로그램을 실행시켜 결과값을 리턴받으면 끝나는 것이죠.
buttonGallery.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
// Gallery 호출
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// 잘라내기 셋팅
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 0);
intent.putExtra("aspectY", 0);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 150);
try {
intent.putExtra("return-data", true);
startActivityForResult(Intent.createChooser(intent,
"Complete action using"), PICK_FROM_GALLERY);
} catch (ActivityNotFoundException e) {
// Do nothing for now
}
}
});
▶ 리턴받아서 결과값을 표현하는 onActivityResult() 에서의 소스는 카메라에서와 동일합니다. 에뮬레이터에 카메라가 설치되어있지 않아 카메라에서 가져오기는 해보지 못했지만 갤러리에서 가져오기는 되니 영상으로 참고하시기 바랍니다.
▶ 아래는 메인 activity 의 전체 xml 입니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="#3F0099"
android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
android:text="갤러리, 이미지 프로그램에서 Bitmap 리턴받아 표시하기 "
android:textColor="#FFFFFF" />
<Button
android:id="@+id/btn_take_camera"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:text="카메라에서 이미지 가져오기"
android:typeface="sans" />
<Button
android:id="@+id/btn_select_gallery"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:text="갤러리에서 이미지 가져오기 "
android:typeface="sans" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:scaleType="fitCenter" />
</LinearLayout>
▶ 아래는 메인 activity 의 전체 소스 입니다.
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class CameraGalleryActivity extends Activity{
private static final int PICK_FROM_CAMERA = 1;
private static final int PICK_FROM_GALLERY = 2;
private ImageView imgview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_gallery);
imgview = (ImageView) findViewById(R.id.imageView1);
Button buttonCamera = (Button) findViewById(R.id.btn_take_camera);
Button buttonGallery = (Button) findViewById(R.id.btn_select_gallery);
buttonCamera.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 카메라 호출
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
// 이미지 잘라내기 위한 크기
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 0);
intent.putExtra("aspectY", 0);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 150);
try {
intent.putExtra("return-data", true);
startActivityForResult(intent, PICK_FROM_CAMERA);
} catch (ActivityNotFoundException e) {
// Do nothing for now
}
}
});
buttonGallery.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
// Gallery 호출
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
// 잘라내기 셋팅
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 0);
intent.putExtra("aspectY", 0);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 150);
try {
intent.putExtra("return-data", true);
startActivityForResult(Intent.createChooser(intent,
"Complete action using"), PICK_FROM_GALLERY);
} catch (ActivityNotFoundException e) {
// Do nothing for now
}
}
});
}
protected void onActivityResult(int requestCode,
int resultCode,
Intent data) {
if (requestCode == PICK_FROM_CAMERA) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
imgview.setImageBitmap(photo);
}
}
if (requestCode == PICK_FROM_GALLERY) {
Bundle extras2 = data.getExtras();
if (extras2 != null) {
Bitmap photo = extras2.getParcelable("data");
imgview.setImageBitmap(photo);
}
}
}
}
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드(Android) GPS 로 현재 이동 속도 알아오기 (5) | 2015.03.05 |
|---|---|
| 안드로이드(Android) Thread 를 이용해 로딩페이지 만들기 (2) | 2015.02.23 |
| 안드로이드(Android) GPS LocationListener 이용해서 도시이름 가져오기 (0) | 2015.02.12 |
| 안드로이드(Android) PopupWindow 위젯을 이용해 팝업창 만들기 (5) | 2015.02.08 |
| 안드로이드(Android) Google Map 버전2 에서 PolyLine 이용해 라인,마크 그리기 (0) | 2015.02.02 |
| 안드로이드(Android) Sdcard 미디어 파일 읽어 MP3 실행하기 (0) | 2015.01.29 |
| 안드로이드(Android) MediaPlayer 이용해 raw 폴더의 MP3 듣기 (0) | 2015.01.26 |
| 안드로이드(Android) 행열(Matrix) 클래스의 postConcat() 함수이용해 거울이미지구현 (0) | 2015.01.25 |
