Android 에서 카메라 와 앨범 을 호출 하 는 방법
레이아웃 파일 activitymain.xml 소스 코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" " />
<Button
android:id="@+id/choose_from_album"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" " />
<ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</LinearLayout>
SD 카드 에 데 이 터 를 기록 하 는 것 과 관련 되 기 때문에 모든 것 은 AndroidMainfest.xml 에서 응답 권한 을 밝 혀 야 합 니 다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
MainActivity.java 원본 코드
package com.example.luoxn28.activity;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class MainActivity extends ActionBarActivity {
private static final String TAG = "hdu";
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2;
public static final int CHOOSE_PHOTO = 3;
private Button takePhoto;
private ImageView picture;
private Uri imageUri;
private Button chooseFromAlbum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
takePhoto = (Button) findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.picture);
chooseFromAlbum = (Button) findViewById(R.id.choose_from_album);
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// File ,
File saveImage = new File(Environment.getExternalStorageDirectory(), "saveImage.jpg");
try {
if (saveImage.exists()) {
saveImage.delete();
}
saveImage.createNewFile();
}
catch (IOException ex) {
ex.printStackTrace();
}
imageUri = Uri.fromFile(saveImage);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//
startActivityForResult(intent, TAKE_PHOTO);
}
});
chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
//
startActivityForResult(intent, CHOOSE_PHOTO);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
if (resultCode == RESULT_OK) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//
startActivityForResult(intent, CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode == RESULT_OK) {
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
//
picture.setImageBitmap(bitmap);
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
break;
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK) {
handleImage(data);
}
break;
default:
break;
}
}
// Android4.4
@TargetApi(19)
private void handleImage(Intent data) {
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(this, uri)) {
// document id
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
// id
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
}
else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
}
else if ("content".equals(uri.getScheme())) {
// document Uri,
imagePath = getImagePath(uri, null);
}
//
displayImage(imagePath);
}
private String getImagePath(Uri uri, String selection) {
String path = null;
// Uri selection
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
private void displayImage(String imagePath) {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
}
else {
Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
}
}
}
카메라 로 사진 을 찍다.MainActivity 에서 해 야 할 첫 번 째 일 은 당연히 Button 과 ImageView 의 인 스 턴 스 를 각각 얻 고 Button 에 이 벤트 를 등록 한 다음 에 Button 의 클릭 이벤트 에서 카 메 라 를 호출 하 는 논 리 를 처리 하 는 것 입 니 다.우 리 는 이 부분 코드 를 중점적으로 봅 니 다.
우선 카메라 에 찍 힌 그림 을 저장 하 는 File 대상 을 만 들 었 습 니 다.여기 서 우 리 는 그림 을 saveImage.jpg 라 고 명명 하고 핸드폰 SD 카드 의 루트 디 렉 터 리 에 저장 합 니 다.Environment 의 getExternal StorageDirectory()방법 으로 얻 은 것 은 바로 핸드폰 SD 카드 의 루트 디 렉 터 리 입 니 다.그리고 Uri 의 from File()방법 으로 File 대상 을 Uri 대상 으로 변환 합 니 다.이 Uri 대상 은 saveImage.jpg 라 는 그림 의 유일한 주 소 를 표시 합 니 다.이 어 Intent 대상 을 구축 하고 이 Intent 의 action 을 android.media.action.IMAGE 로 지정 합 니 다.CAPTURE,Intent 의 putExtra()방법 으로 그림 의 출력 주 소 를 지정 합 니 다.방금 받 은 Uri 대상 을 입력 하고 마지막 으로 startActivity ForResult()를 호출 하여 활동 을 시작 합 니 다.우리 가 사용 하 는 것 은 암시 적 인 Intent 이기 때문에 시스템 은 이 Intent 에 응답 할 수 있 는 활동 을 찾 아 시작 할 것 입 니 다.그러면 카메라 프로그램 이 열 리 고 찍 은 사진 은 saveImage.jpg 에 출력 될 것 입 니 다.
방금 우 리 는 startActivity ForResult()를 사용 하여 활동 을 시 작 했 기 때문에 사진 을 찍 은 후에 결과 가 onActivity Result()방법 으로 돌아 갈 수 있 습 니 다.사진 이 성공 한 것 을 발견 하면 Intent 대상 을 다시 구축 하고 action 을 com.android.camera.action.ROP 로 지정 합 니 다.이 Intent 는 찍 은 사진 을 재단 하 는 데 사 용 됩 니 다.방금 startActivity ForResult()를 사용 하여 활동 을 시 작 했 기 때문에 사진 을 찍 은 후에 결과 가 onActivity Result()방법 으로 돌아 갈 수 있 습 니 다.사진 이 성공 한 것 을 발견 하면 Intent 대상 을 다시 구축 하고 action 을 com.android.camera.action.ROP 로 지정 합 니 다.이 인 텐트 는 찍 은 사진 을 재단 하 는 데 쓰 인 다.
앨범 에서 사진 선택
"앨범 에서 그림 선택"단 추 를 누 르 는 이벤트 에서 우 리 는 앨범 에서 선택 한 그림 을 저장 하기 위해 File 대상 을 만 들 었 습 니 다.그리고 Intent 대상 을 구축 하고 action 을 android.intent.action.GET 로 지정 합 니 다.CONTENT。이 어 이 Intent 대상 에 필요 한 인 자 를 설정 합 니 다.크기 조정 과 재단,그림 의 출력 위치 등 을 포함 합 니 다.마지막 으로 startActivity ForResult()방법 을 호출 하면 앨범 프로그램 을 열 어 사진 을 선택 할 수 있 습 니 다.
startActivity ForResult()방법 을 호출 할 때 두 번 째 매개 변수 에 들 어 오 는 값 은 여전히 CROP 입 니 다.PHOTO 상수,이러한 장점 은 앨범 에서 사진 을 선택 한 후 바로 CROP 로 들 어 가 는 것 입 니 다.PHOTO 의 case 에서 그림 을 표시 합 니 다.그러면 이전에 작성 한 그림 을 표시 하 는 논 리 를 다시 사용 할 수 있 습 니 다.다시 작성 하지 않 아 도 됩 니 다.
참고 자료
1.카메라 섹 션 호출
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.