안 드 로 이 드 는 시스템 카 메 라 를 사용 하여 사진 을 찍 는 절 차 를 진행한다.

머리말
우 리 는 일상적인 개발 에서 가끔 카 메 라 를 사용 해 야 하 는 수 요 를 만 날 수 있 고 카메라 도 자주 사용 하 는 물건 이다.예 를 들 어 QR 코드 를 스 캔 하거나 사진 을 찍 어 올 리 는 등 이다.여기 서 나 는 qq 처럼 강 한 사진 기능 을 사용자 정의 하 는 것 을 말 하지 않 는 다.
시스템 카메라 호출 절차
여기 서 나 는 간단 한 예 를 통 해 이 내용 을 말한다.
나 는 스스로 demo 를 썼 다.구 조 는 매우 간단 하 다.

<Button
 android:id="@+id/button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginTop="4dp"
 android:text="take phone"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintHorizontal_bias="0.281"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toTopOf="parent" />

 <ImageView
 android:id="@+id/imageView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginTop="29dp"
 app:layout_constraintEnd_toEndOf="parent"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintTop_toBottomOf="@+id/button"
 app:srcCompat="@mipmap/ic_launcher_round" />
바로 버튼 을 눌 러 카 메 라 를 튕 기 고 이미지 뷰 가 찍 은 사진 을 표시 하 는 것 이다.
이어서 나 는 호출 된 전체 과정 에서 우리 가 무엇 을 해 야 할 지 생각해 보 겠 다.
우선 카 메 라 를 튕 기 려 면 카메라 라 는 애플 리 케 이 션 으로 뛰 어야 한다.그러면 카 메 라 를 내 현적 으로 작 동 시 켜 야 한다.
그리고 애플 리 케 이 션 으로 돌아 갈 때 사진 을 표시 해 야 하기 때문에 startActivity ForResult 라 는 방법 을 사용 해 야 합 니 다.
그 다음 에 우 리 는 사진 을 찍 은 후에 반드시 저장 해 야 한다.그러면 파일 의 조작 과 관련된다.
메모리 와 관련 된 작업 은 반드시 권한 과 접촉 해 야 하 며,모든 권한 과 관련 된 내용 이 있어 야 한다.
마지막 으로 또 하나의 문 제 는 카메라 가 사진 을 찍 은 후에 사진 을 저장 해 야 하기 때문에 우 리 는 그 에 게 주소 uri 를 주어 야 하지만 주 소 를 직접 매개 변수 로 보 내 면 안 됩 니까?특수 콘 텐 츠 제공 기 FileProvider 를 사용 해 야 합 니 다.
위 에는 카 메 라 를 호출 하 는 데 필요 한 내용 이 있 습 니 다.모두 얕 게 사용 되 지만 관련 이 있 습 니 다.다음은 구체 적 으로 어떻게 실현 되 는 지 살 펴 보 자.Activity 의 onCreate 코드 보기:

 private Uri imageUri;
 private ImageView imageView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 imageView = findViewById(R.id.imageView);

 Button button = findViewById(R.id.button);
 button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {

  //    File  。getExternalCacheDir()         ,outputImage.jpg     
  File outputImage = new File(getExternalCacheDir(),"outputImage.jpg");
  try{  
  //         
   outputImage.createNewFile();
  }catch (IOException e){
   e.printStackTrace();
  }

  //              Uri   
  if (Build.VERSION.SDK_INT>=24){
   imageUri =FileProvider.getUriForFile(MainActivity.this,"huan",outputImage);
  }else{
   imageUri = Uri.fromFile(outputImage);
  }

  //       Activity
  Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
  intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  startActivityForResult(intent,1);
  }
 });
여기 코드 를 살 펴 보 겠 습 니 다.앞의 코드 는 간단 합 니 다.바로 컨트롤 의 초기 화 입 니 다.
우 리 는 사진 이 폴 더 를 넣 어야 한 다 는 것 을 알 고 있 기 때문에 파일 대상 을 만 들 고 파일 의 경로 와 이름 을 지정 해 야 합 니 다.이 경 로 는 왜 getExternalCacheDir()를 사용 합 니까?모든 응용 프로그램 에 해당 하 는 캐 시 디 렉 터 리 가 있 기 때문에 이 디 렉 터 리 에 접근 할 때 메모리 권한 에 접근 하지 않 아 도 됩 니 다.그러면 필요 한 권한 의 절 차 를 절약 할 수 있 습 니 다.이 디 렉 터 리 는/scare/Android/data/cache 에 있 습 니 다.
그리고 빈 폴 더 를 만 듭 니 다.여기에 이미 사진 이 있다 면 예 를 들 어 우리 가 두 번 째 로 사진 을 찍 었 을 때 새로운 빈 폴 더 를 만 들 지 않 았 을 것 이다.저장 할 때 까지 교체 된다.
그리고 우리 가 방금 말 했 듯 이 찍 힌 그림 을 우리 의 응용 프로그램 에서 보 여 주 려 면 반드시 콘 텐 츠 제공 기 를 사용 해 야 한다.여기 서 FileProvider 를 사용 하여 uri 를 가 져 옵 니 다.provider 에 대해 서 는 다음 과 같이 말씀 드 리 겠 습 니 다.
4.4 버 전 이하 의 안 드 로 이 드 라면 Uri.from File(outputImage)을 사용 합 니 다.방법 은 uri 를 얻 을 수 있 습 니 다.
카메라 activity 를 암시 적 으로 시작 하면 카 메 라 를 열 수 있 습 니 다.여기 시스템 카메라 의 action 은 android.media.action.IMAGE 입 니 다.CAPTURE,카메라 저장 경로 의 매개 변수 이름 은 MediaStore.EXTRAOUTPUT,그리고 uri 를 전송 합 니 다.
자,이렇게 사진 을 찍 고 사진 을 저장 하 는 절 차 를 마 쳤 습 니 다.이제 뭐 가 부족 해?참,사진 보 여 줘.현재 메모리 에 이미 이 사진 이 있 습 니 다.그리고 uri 도 알 고 있 기 때문에 쉽게 코드 를 볼 수 있 습 니 다.

 @Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
 if (requestCode == 1) {
  if (resultCode == RESULT_OK)
  try {
   Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
   imageView.setImageBitmap(bitmap);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
 }
우 리 는 방금 startActivity ForResult 를 사용 하여 활동 을 시 작 했 기 때문에 이 방법 을 다시 써 서 그림 을 표시 해 야 한다.여기 서 먼저 어떤 시작 명령 인지 판단 한 다음 에 성공 적 으로 시작 되 었 는 지 판단 한 다음 에 BitmapFactory.decodeStream 이라는 방법 으로 bitmap 를 가 져 온 다음 에 bitmap 를 표시 하면 됩 니 다.BitmapFactory.decodeStream 이라는 방법 은 하나의 흐름 이 필요 합 니 다.getContentResolver().openInputStream 이라는 방법 으로 하나의 흐름 을 열 수 있 습 니 다.
여기 서 모든 절차 가 해결 되 었 다.
FileProvider
FileProvider 는 특수 한 콘 텐 츠 제공 기 입 니 다.file 로 시작 하 는 uri 를 content 로 시작 할 수 있 습 니 다.예 를 들 어:file://uri -> content://uri。근 데 왜 그 랬 을 까?여기 서 간단하게 말씀 드 리 겠 습 니 다.
이 는 안 드 로 이 드 7.0 이후 실제 경로 의 uri 를 다른 애플 리 케 이 션 으로 직접 전송 하 는 것 을 공식 적 으로 금지 하고 주 소 를 카메라 에 보 내야 하기 때문에 문제 가 생 길 수 있 습 니 다.상세 한 것 은 이 블 로 그 를 찾 아 볼 수 있다.
콘 텐 츠 제공 기 라면 등록 을 해 야 합 니 다.

<provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="huan"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/file_paths" />
 </provider>
이 곳 의 authorities 인 자 는 앞의 getUriForFile 방법의 두 번 째 인자 와 일치 해 야 합 니 다.같은 콘 텐 츠 제공 기의 authorities 는 똑 같 아야 합 니 다.grantUriPermissions 인 자 는 반드시 true 여야 합 니 다.이것 은 아마도 그의 모든 요소 에 접근 할 수 있 는 권한 을 부여 하 는 것 입 니 다.FileProvider 에서 이 인 자 는 true 여야 합 니 다.(이것 도 4.4 버 전의 안 드 로 이 드 가 사용 할 수 없 는 이유 중 하나 입 니 다.관심 이 있 으 면 알 아 보 세 요)export 라 는 인 자 는 다른 응용 프로그램 에 공유 할 수 있 는 지 여 부 를 표시 합 니 다.false 로 설정 합 니 다. <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_image" path="/"/> </paths>작은 매듭
시스템 카 메 라 를 호출 하 는 기능 은 어렵 지 않 고 코드 도 많 지 않 지만 그 중의 자질구레한 지식 이 많 고 흩 어 져 있 으 니 주의해 야 한다.특히 저 사양 의 안 드 로 이 드 버 전에 대해 서 는 각별히 주의해 야 한다.
이상 은 안 드 로 이 드 가 시스템 카 메 라 를 사용 하여 사진 을 찍 는 절차 의 상세 한 내용 입 니 다.안 드 로 이 드 적용 시스템 카메라 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기