안 드 로 이 드 오디 오 비디오 수집(시스템 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();
}
}
데모 링크 보기 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.