안 드 로 이 드 오디 오 비디오 수집(시스템 API 미리 보기)

우 리 는 영상 과 관련 된 기초 지식 을 알 게 되 었 다.뒤의 글 은 우리 가 오디 오 와 마찬가지 로 우리 의 영상 을 수집 할 수 있어 야 한다.영상 은 한 프레임 한 프레임 의 사진 으로 온 것 이다.우 리 는 먼저 미리 보기 영상 을 배 운 다음 에 한 프레임 의 사진 을 수집 하고 영상 을 수집 하 는 것 은 간단 한 것 에서 어 려 운 것 까지 이 문 제 를 풀 었 다.우선 첫 번 째 반응 은 구 글 검색 과 안 드 로 이 드 동 영상 수집 과 관련 된 것 을 열 고 API 를 통 해 수집 하 는 방법 을 알 아야 합 니 다.자신 도 모 르 게 안 드 로 이 드 홈 페이지 의 Camera API 에 도 착 했 습 니 다.Android 는 두 개의 동 영상 채집 API 가 있 습 니 다.Camera 는 Android 5.0 이전에 사 용 했 는데 지금 은 폐기 되 었 습 니 다.우 리 는 그의 사용 을 배 워 야 합 니 다.Camera 2 는 최신 동 영상 채집 API 입 니 다.우 리 는 그것 의 사용 에 중심 을 두 고 알 고 있 습 니 다.이 글 은 시스템 의 사진 촬영 과 비디오 API 를 호출 하여 사진 녹화 기능 을 실현 하 는 것 을 파악 하고 있다.
Camera
이것 은 API 21(Android 5.0)이전에 카메라 데 이 터 를 수집 하 는 데 사 용 된 API 입 니 다.우 리 는 처음부터 각 부분의 핵심 내용 을 다음 과 같이 기록 합 니 다.
기초 지식
먼저 카 메 라 를 사용 하 는 데 몇 가지 관련 유형 이 있 는 지 알 아 보 겠 습 니 다.
Camera:API 21 이후 오래된 API 제어 카메라 장치
Surface View:사용자 에 게 카메라 미리 보기 그림 표시
MediaRecorder:카메라 영상 녹화
권한 선언
카메라 권한:카메라 장 치 를 사용 하려 면 권한 을 설명해 야 합 니 다.

<uses-permission android:name="android.permission.CAMERA" />
그러나 우리 가 Intent 를 사용 하여 시스템 자체 의 카메라 장 치 를 호출 하여 비디오 를 찍 을 때 이 권한 이 필요 하지 않다.
카메라 특징:응용 프로그램 은 카메라 특성 사용 권한 을 밝 혀 야 합 니 다.(이것 은 무슨 뜻 인지 uses-feature 라 는 목록 파일 의 의 미 를 알 아야 합 니 다)

<uses-feature android:name="android.hardware.camera" />
오디 오 녹음 권한:비디오 를 녹음 할 때 우 리 는 오디 오 에 이 권한 을 추가 해 야 합 니 다.

<uses-permission android:name="android.permission.RECORD_AUDIO" />
저장 권한:사진 과 동 영상 을 저장 장치 에 저장 하려 면 이 권한 을 추가 해 야 합 니 다.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
위치 지정 권한:사진 의 태그 가 GPS 위치 정 보 를 원한 다 면 다음 과 같은 권한 이 필요 합 니 다.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
...
<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
<uses-feature android:name="android.hardware.location.gps" />
시스템 의 카메라 app 을 호출 하여 영상 을 찍 고 녹화 하 다.
사진 을 찍다
카메라 특징 요청

<manifest ... >
 <uses-feature android:name="android.hardware.camera"
     android:required="true" />
 ...
</manifest>
이 권한 은 Google Play 로 하여 금 장치 가 앱 다운 로드 를 지원 하 는 지 여 부 를 판단 하 게 합 니 다.required 를 true 로 설정 하면 반드시 카메라 하드웨어 장치 가 있어 야 다운로드 할 수 있 습 니 다.required 를 false 로 설정 하면 카메라 하드웨어 장치 가 없 는 것 도 다운로드 할 수 있 습 니 다.프로그램 에서 카메라 가 사용 가능 한 지 여 부 를 판단 해 야 합 니 다.
기본 Intent 로 사진 찍 기 시작
시스템 을 켜 고 앱 을 찍 는 인 텐트 를 기본 으로 호출 합 니 다.

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
  startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
 }
}
사진 가 져 오기
우 리 는 방금 startActivity ForResult 를 통 해 사진 을 찍 었 습 니 다.자 연 스 럽 게 onActivity Result 에서 되 돌아 오 는 데 이 터 를 받 았 습 니 다.우 리 는 그림 을 ImageView 에 표시 합 니 다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
  Bundle extras = data.getExtras();
  Bitmap imageBitmap = (Bitmap) extras.get("data");
  mImageView.setImageBitmap(imageBitmap);
 }
}
이러한 기본 사진 을 통 해 우 리 는 안 드 로 이 드 6.0 이상 의 기계 에서 어떠한 권한 도 설명 하지 않 아 도 성공 적 으로 실행 할 수 있다.
사용자 정의 사진 저장 경로
우리 의 위의 작업 은 bitmap 를 가 져 왔 습 니 다.우리 의 그림 정 보 는 모두 메모리 에서 작 동 합 니 다.만약 에 우리 가 사진 을 찍 은 그림 을 메모리 카드 에 저장 하고 그림 을 보 려 면 우 리 는 메모리 카드 를 쓸 수 있 는 권한 만 설명 하면 됩 니 다.

<manifest ...>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 ...
</manifest>
사진 코드 다시 요청 시작

static final int REQUEST_TAKE_PHOTO = 1;

private void dispatchTakePictureIntent() {
 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 // Ensure that there's a camera activity to handle the intent
 if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
  // Create the File where the photo should go
  File photoFile = null;
  try {
   photoFile = createImageFile();
  } catch (IOException ex) {
   // Error occurred while creating the File
   ...
  }
  // Continue only if the File was successfully created
  if (photoFile != null) {
   Uri photoURI = FileProvider.getUriForFile(this,
             "com.example.android.fileprovider",
             photoFile);
   takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
   startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
  }
 }
}

String mCurrentPhotoPath;

private File createImageFile() throws IOException {
 // Create an image file name
 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
 String imageFileName = "JPEG_" + timeStamp + "_";
 File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
 File image = File.createTempFile(
  imageFileName, /* prefix */
  ".jpg",   /* suffix */
  storageDir  /* directory */
 );

 // Save a file: path for use with ACTION_VIEW intents
 mCurrentPhotoPath = image.getAbsolutePath();
 return image;
}
위의 코드 는 FileProvider.getUriForFile 방법 을 사용 하여 되 돌 아 왔 습 니 다.content://URI이 API 는 Android 7.0 이상 에서 사용 되 며 처리 하지 않 으 면 FileUriExposedException 을 던 집 니 다.목록 파일 에 FileProvider 를 설정 하려 고 합 니 다.

<application>
 ...
 <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="com.example.android.fileprovider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
   android:name="android.support.FILE_PROVIDER_PATHS"
   android:resource="@xml/file_paths"></meta-data>
 </provider>
 ...
</application>
res/xml/filepaths 프로필

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
 <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>
앨범 에 사진 추가
우리 위의 사진 저장 위치 루트 디 렉 터 리 는 getExternal FilesDir(Environment.DIRECTORYPICTURES);이 디 렉 터 리 아래 멀티미디어 스캐너 는 우리 의 사진 을 찾 을 수 없습니다.왜냐하면 그것 은 우리 앱 의 개인 적 인 것 이기 때 문 입 니 다.아래 코드 는 시스템 의 멀티미디어 스캐너 로 하여 금 우리 의 그림 을 Media Provider's 데이터베이스 에 추가 하여 우리 의 그림 이 시스템 앨범 과 다른 응용 프로그램 에 모두 사용 할 수 있 도록 할 수 있다.

private void galleryAddPic() {
  Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  File f = new File(mCurrentPhotoPath);
  try {
   MediaStore.Images.Media.insertImage(getContentResolver(),
     f.getAbsolutePath(), f.getName(), null);
   Log.d(TAG, "galleryAddPic: add to Media Scanner success");
  } catch (FileNotFoundException e) {
   e.printStackTrace();
   Log.e(TAG, "galleryAddPic: add to Media Scanner failed");
  }

  Uri contentUri = Uri.fromFile(f);
  mediaScanIntent.setData(contentUri);
  this.sendBroadcast(mediaScanIntent);
  Toast.makeText(this, "Add to Gallery success", Toast.LENGTH_SHORT).show();
 }
디 코딩 크기 조정 그림
우 리 는 그림 ImageView 에서 아무런 처리 도 하지 않 았 습 니 다.그림 이 크 면 oom 의 크기 를 조정 할 수 있 습 니 다.

private void setPic() {
 // Get the dimensions of the View
 int targetW = mImageView.getWidth();
 int targetH = mImageView.getHeight();

 // Get the dimensions of the bitmap
 BitmapFactory.Options bmOptions = new BitmapFactory.Options();
 bmOptions.inJustDecodeBounds = true;
 BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
 int photoW = bmOptions.outWidth;
 int photoH = bmOptions.outHeight;

 // Determine how much to scale down the image
 int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

 // Decode the image file into a Bitmap sized to fill the View
 bmOptions.inJustDecodeBounds = false;
 bmOptions.inSampleSize = scaleFactor;
 bmOptions.inPurgeable = true;

 Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
 mImageView.setImageBitmap(bitmap);
}

데모 코드 참조
비디오
비디오 재생 코드 를 녹화 하 는 것 은 매우 간단 하 다.만약 에 비디오 재생 기 를 맞 추 려 면 시간 이 지나 면 더 많은 것 이 필요 하 다.우 리 는 지금 시스템 에서 녹화 한 영상 만 간단하게 재생 할 수 있다.
비디오 녹화 인 텐트 열기

static final int REQUEST_VIDEO_CAPTURE = 1;

private void dispatchTakeVideoIntent() {
 Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
 if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
  startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
 }
}
onActivity Result 에서 영상 을 받 아서 Uri 가 틀 어 줍 니 다.

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
   Uri videoUri = intent.getData();
   Log.d(TAG, "onActivityResult: " + videoUri);
   mVideoView.setVideoURI(videoUri);
   mVideoView.requestFocus();
   mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

    @Override
    public void onPrepared(MediaPlayer mp) {
     mp.setLooping(false);//        
    }
   });
   mVideoView.start();//    
   MediaController mediaController = new MediaController(this);//     
   mVideoView.setMediaController(mediaController);
   mediaController.setMediaPlayer(mVideoView);//       
   mediaController.show();
  }
 }
데모 링크 보기
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기