Android 호출 시스템 카메라 촬영 및 촬영 방법

머리말
많은 장면 에서 카메라 로 사진 이나 동 영상 을 찍 고 사진 이나 동 영상 을 바탕 으로 처리 해 야 한다.그러나 안 드 로 이 드 시스템 의 소스 코드 는 오픈 소스 이 고 많은 설비 업 체 들 이 사용 할 수 있 으 며 맞 춤 형 제작 이 혼 란 스 럽 습 니 다.일반적으로 카메라 로 사진 을 찍 거나 촬영 해 야 할 때 시스템 기 존의 카메라 애플 리 케 이 션 을 직접 호출 하여 사진 을 찍 거나 촬영 을 한다.우 리 는 촬영 결과 만 취하 여 처리 함으로써 서로 다른 장치 의 카메라 의 세부 적 인 문 제 를 피한다.이 블 로 그 는 안 드 로 이 드 애플 리 케 이 션 에서 기 존 카메라 애플 리 케 이 션 을 이용 해 사진 과 단편 영 화 를 촬영 하고 처리 하 는 방법 을 소개 하 며,마지막 으로 간단 한 데모 로 효 과 를 보 여 준다.
1.시스템 기 존 카메라 응용 호출
시스템 의 기 존 응용 을 어떻게 호출 하 는 지 에 대해 서 는 전에 설명 이 있 었 는데,여기 서 간단하게 다시 한 번 말씀 드 리 겠 습 니 다.개 발 된 애플 리 케 이 션 에서 시스템 기 존 애플 리 케 이 션 을 호출 하려 면 Intent 가 지정 한 애플 리 케 이 션 과 Category 를 사용 한 다음 startActivity(Intent)나 startActivity ForResult(Intent,int)를 통 해 지정 한 Activity 를 열 어야 합 니 다.startActivity ForResult()방법 으로 열 리 고 값 을 되 돌려 야 한다 면 onActivity Result(int,int,Intent)를 다시 쓰 면 됩 니 다.
시스템 기 존 카메라 에 적 용 된 AndroidManifest.xml 목록 파일 이 정의 하 는 Activity 를 살 펴 보 겠 습 니 다.

<activity
  android:name="com.android.camera.Camera"
  android:clearTaskOnLaunch="true"
  android:configChanges="orientation|keyboardHidden"
  android:screenOrientation="landscape"
  android:taskAffinity="android.task.camera"
  android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <categroy android:name="android.intent.category.DEFAULT" />
  <categroy android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <intent-filter>
  <action android:name="android.media.action.IMAGE_CAPTURE" />
  <categroy android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  <intent-filter>
  <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
  <categroy android:name="android.intent.category.DEFAULT" />
  </intent-filter>
 </activity>
 <activity
  android:name="com.android.camera.VideoCamera"
  android:clearTaskOnLaunch="true"
  android:configChanges="origientation|keyboardHidden"
  android:label="@string/video_camera_label"
  android:screenOrientation="landscape"
  android:taskAffinity="android.task.camcorder"
  android:theme="@android:style/theme.Black.NoTitleBar.Fullscreen" >
  <intent-filter>
  <action android:name="android.media.action.VIDEO_CAMERA" />
  <categroy android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  <intent-filter>
  <action android:name="android.media.action.VIDEO_CAPTURE" />
  <categroy android:name="android.intent.category.DEFAULT" />
  </intent-filter>
 </activity>

이것 은 두 개의 Activity,com.android.camera.camera 는 카 메 라 를,com.android.camera.VideoCamera 는 카 메 라 를 정의 합 니 다.말 그대로 시스템 카메라 가 되 돌아 오 는 데 이 터 를 잡기 위해 서 는 보통 두 개의 Action 을 사용 하면 카메라 와 카 메 라 를 켤 수 있다.
  • android.media.action.IMAGE_CAPTURE:Intent 의 Action 형식 으로 기 존 카메라 애플 리 케 이 션 에서 그림 을 요청 합 니 다.
  • android.media.action.VIDEO_CAPTURE:Intent 의 Action 형식 으로 기 존 카메라 애플 리 케 이 션 에서 동 영상 을 요청 합 니 다.
  • 위의 두 매개 변 수 는 모두 MediaStore 류 에서 정적 상수 의 형식 으로 정의 되 었 습 니 다.각각 MediaStore.ACTION 입 니 다.IMAGE_CAPTURE(카메라)와 MediaStore.ACTIONVIDEO_CAPTURE.
    2,시스템 기 존 카메라 촬영 사진
    기 존 카 메 라 를 켜 고 사진 을 찍 을 때 사용 해 야 할 MediaStore.ACTIONIMAGE_CAPTURE 는 Intent 의 action 으로 Activity 를 켜 면 됩 니 다.그러나 시스템 기 존 카 메 라 를 사용 할 때 기본적으로 그림 을 시스템 갤러리 디 렉 터 리 에 저장 합 니 다.그림 파일 의 저장 경 로 를 지정 하려 면 Intent 에 추가 로 설정 해 야 합 니 다.
    시스템 기 존 카메라 에 적 용 된 사진 의 저장 경 로 를 설정 하려 면 Intent.putExtra()방법 으로 MediaStore.EXTRA 를 통과 해 야 합 니 다.OUTPUT 는 Intent 의 추가 데 이 터 를 설정 합 니 다.여기 서 전달 하 는 것 은 Uri 매개 변수 이 고 파일 경로 의 Uri 일 수 있 습 니 다.
    
    Intent intent=new Intent();
      //          Action
      intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.addCategory(Intent.CATEGORY_DEFAULT);
      //           
      File file=new File(FILE_PATH);
      //         Uri  
      Uri uri=Uri.fromFile(file);
      //                       
      intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    3.시스템 기 존 카메라 가 촬영 한 사진 가 져 오기
    새로 열 린 Activity 에서 반환 값 을 가 져 오 려 면 startActivity ForResult(Intent,int)방법 으로 Activity 를 열 고 onActivity Result(int,int,Intent)를 다시 써 서 시스템 카메라 의 반환 데 이 터 를 가 져 와 야 합 니 다.그러면 우 리 는 onActivity Result()에서 반환 값 을 가 져 오 면 됩 니 다.
    시스템 카메라 가 찍 은 사진 은 경 로 를 지정 하지 않 으 면 시스템 기본 폴 더 에 저장 되 며,Intent.getExtra()방법 으로 얻 을 수 있 으 며,콘 텐 츠 제공 자의 주 소 를 표시 하 는 Uri 주 소 를 얻 었 습 니 다.MediaStore.EXTRA 를 통 해OUTPUT 에서 저장 경 로 를 지정 하 였 습 니 다.그러면 Intent.getExtra()를 통 해 얻 은 것 은 빈 주소 가 될 것 입 니 다.하지만 우리 가 지정 한 주소 라면 찾 을 수 없 을 것 입 니 다. 
    4.시스템 기 존 카메라 촬영 이미지 데모
    개발 한 애플 리 케 이 션 에서 시스템 카 메 라 를 이용 해 사진 을 찍 고 그 와 관련 된 내용 을 얻 는 방법 을 설명 하 였 으 며,다음은 간단 한 데모 로 보 여 드 리 겠 습 니 다.데모 에 서 는 두 개의 Button 이 각각 경 로 를 지정 하 는 방식 과 경 로 를 지정 하지 않 는 방식 으로 시스템 카 메 라 를 시작 하고 반환 값 을 가 져 와 ImageView 에 표시 합 니 다.데모 에 서 는 설명 이 상세 합 니 다.여 기 는 더 이상 설명 하지 않 습 니 다.
    레이아웃 코드:activitysyscamera.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/btn_StartCamera"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="      --     SD " />
     <Button
     android:id="@+id/btn_StartCameraInGallery"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="      --    " />
     <ImageView
     android:id="@+id/iv_CameraImg"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />
    
    </LinearLayout>
    
    
    구현 코드:SysCameraActivity.java
    
    package cn.bgxt.callsystemcamera;
    
    import java.io.File;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class SysCameraActivity extends Activity {
     private Button btn_StartCamera, btn_StartCameraInGallery;
     private ImageView iv_CameraImg;
    
     private static final String TAG = "main";
     private static final String FILE_PATH = "/sdcard/syscamera.jpg";
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_syscamera);
    
     btn_StartCamera = (Button) findViewById(R.id.btn_StartCamera);
     btn_StartCameraInGallery = (Button) findViewById(R.id.btn_StartCameraInGallery);
     iv_CameraImg = (ImageView) findViewById(R.id.iv_CameraImg);
    
     btn_StartCamera.setOnClickListener(click);
     btn_StartCameraInGallery.setOnClickListener(click);
     }
    
     private View.OnClickListener click = new View.OnClickListener() {
    
     @Override
     public void onClick(View v) {
      
      Intent intent = null;
      switch (v.getId()) {
      //             
      case R.id.btn_StartCamera:
      intent = new Intent();
      //          Action
      intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.addCategory(Intent.CATEGORY_DEFAULT);
      //           
      File file = new File(FILE_PATH);
      if (file.exists()) {
       file.delete();
      }
      //         Uri  
      Uri uri = Uri.fromFile(file);
      //                       
      intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
      startActivityForResult(intent, 0);
      break;
      //              
      case R.id.btn_StartCameraInGallery:
      intent = new Intent();
      //          Action
      intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.addCategory(Intent.CATEGORY_DEFAULT);
      startActivityForResult(intent, 1);
      break;
      default:
      break;
      }
    
     }
     };
    
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     Log.i(TAG, "        ,resultCode="+resultCode);
     
     if (requestCode == 0) {
      File file = new File(FILE_PATH);
      Uri uri = Uri.fromFile(file);
      iv_CameraImg.setImageURI(uri);
     } else if (requestCode == 1) {
      Log.i(TAG, "  content  :"+data.getData());
      iv_CameraImg.setImageURI(data.getData());
     }
     }
    }
    
    효과 표시:

    시스템 에 있 는 카메라 애플 리 케 이 션 을 호출 하여 촬영 한 그림 을 가 져 오 는 방법 을 간단하게 보 여 주 었 을 뿐 이미지 자원 을 회수 하지 않 았 기 때문에 메모리 가 넘 치 는 오류 가 있 을 수 있 습 니 다.다시 시작 하면 됩 니 다.
    5.시스템 기 존 카메라 촬영 영상
    시스템 기 존의 카메라 애플 리 케 이 션 에서 촬영 한 영상 을 가 져 오 는 것 은 촬영 한 사진 을 가 져 오 는 과정 과 대체적으로 같 지만 putExtra()를 통 해 MediaStore.EXTRA 를 설정 할 수 있 는 것 을 제외 하고OUTPUT 출력 경 로 를 제외 하고 다른 값 도 설정 할 수 있 습 니 다.여기 서 간단하게 소개 하 겠 습 니 다.
  • MediaStore.EXTRA_OUTPUT:미디어 파일 의 저장 경 로 를 설정 합 니 다.
  • MediaStore.EXTRA_VIDEO_QUALITY:비디오 녹화 의 질 을 설정 하고 0 은 낮은 품질 이 며 1 은 높 은 품질 이다.
  • MediaStore.EXTRA_DURATION_LIMIT:동 영상 을 최대 로 녹화 할 수 있 는 시간 을 설정 하고 단 위 는 밀리초 입 니 다.
  • MediaStore.EXTRA_SIZE_LIMIT:동 영상의 최대 허용 사 이 즈 를 지정 하고 단 위 는 byte 입 니 다.
  • 6.시스템 기 존 카메라 촬영 영상 데모
    사진 을 찍 는 절차 와 마찬가지 로 여 기 는 더 이상 힘 들 게 말 하지 않 고 데모 로 바로 올 라 갑 니 다.데모 에 서 는 하나의 Button 을 통 해 기 존 카메라 로 영상 을 촬영 하 는 시스템 을 시작 해 SD 카드 에 저장 합 니 다.
    구현 코드:
    
    package cn.bgxt.callsystemcamera;
    
    import java.io.File;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class SysVideoCameraActivity extends Activity {
     private Button btn_StartVideoCamera;
     private static final String FILE_PATH = "/sdcard/sysvideocamera.3gp";
     private static final String TAG="main";
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_sysvideocamera);
    
     btn_StartVideoCamera = (Button) findViewById(R.id.btn_StartVideoCamera);
     btn_StartVideoCamera.setOnClickListener(click);
     }
    
     private View.OnClickListener click = new View.OnClickListener() {
    
     @Override
     public void onClick(View v) {
      Intent intent = new Intent();
      intent.setAction("android.media.action.VIDEO_CAPTURE");
      intent.addCategory("android.intent.category.DEFAULT");
      File file = new File(FILE_PATH);
      if(file.exists()){
      file.delete();
      }
      Uri uri = Uri.fromFile(file);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
      startActivityForResult(intent, 0);
     }
     };
     
    
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     Log.i(TAG, "    ,resultCode="+requestCode);
     }
    
    }
    
    효과 표시:

    원본 다운로드:Android 호출 시스템 카메라 사진 및 촬영
    총결산
    기 존 카메라 애플 리 케 이 션 을 어떻게 사용 하 는 지,사진 과 동 영상 을 찍 는 지 설명 하 겠 습 니 다.카메라 가 아 닌 프로젝트 에 서 는 사진 을 찍 어야 한다 면 기 존 카메라 애플 리 케 이 션 을 호출 하 는 것 이 일반적 이 며,카메라 하드웨어 를 직접 호출 하여 이미 지 를 가 져 오 는 것 이 아 닙 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기