Android 에서 카메라 와 앨범 을 호출 하 는 방법

10033 단어 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.카메라 섹 션 호출
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기