初識Camera,呼叫系統拍照錄像程式
Camera 官方指南,英語不太好,翻譯有可能不準確,見諒 o(^▽^)o
關於拍照錄像,有兩種處理方式,一種是構建Intent呼叫系統或其他的APP,另一種是自定義自己的拍照或錄影介面,下面就講解一下這兩種方式
Manifest中Camera相關的配置
攝像頭許可權
<uses-permission android:name="android.permission.CAMERA" />
ps:如果你通過Intent呼叫系統或者其他APP的拍照錄像功能,該許可權可以不用設定
其他功能
<uses-feature android:name ="android.hardware.camera" />
Camera的功能(官方清單)
android.hardware.camera 程式使用裝置攝像頭
android.hardware.camera.autofocus 子功能,攝像頭自動聚焦功能
android.hardware.camera.flash 子功能,使用閃光燈
android.hardware.camera.front 子功能,使用前置攝像頭
如果你的應用能通過正常的操作使用攝像頭和攝像頭的這些功能,但是不需要使用它,那麼你需要在你的聲明裡增加android:required屬性,並設定為false(有些繞口,其實我也是似懂非懂的 -_-#)
<uses-feature android:name="android.hardware.camera" android:required="false" />
儲存許可權
如果你需要儲存圖片或視訊到裝置的外部儲存器(SD Card)中,你需要增加許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
音訊錄製許可權
如果你需要錄製音訊的話,你需要增加許可權
<uses-permission android:name="android.permission.RECORD_AUDIO" />
定位許可權
如果你的圖片需要增加GPS定位資訊的話,你需要增加許可權
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
呼叫系統或者其他APP的拍照錄像功能
拍照和錄影的一個快速的整合辦法就是通過Intent呼叫系統或者其他APP的拍照錄像功能。
基本步驟
1. Compose a Camera Intent,建立一個Intent去獲取圖片和視訊,使用下面其中一個Intent型別
MediaStore.ACTION_IMAGE_CAPTURE:通過其他Camera APP獲取圖片
MediaStore.ACTION_VIDEO_CAPTURE:通過其他Camera APP獲取視訊
2. Start the Camera Intent,使用startActivityForResult()方法執行建立的Camera Intent
3. Receive the Intent Result,重寫onActivityResult()方法去接收從這個Camera Intent返回回來的資料
圖片捕獲Intent
捕獲圖片的Intent可以包含額外的資訊
MediaStore.EXTRA_OUTPUT
指定一個地址和名稱去構建一個Uri,儲存你想儲存的圖片。這個屬性是可選的,但是強烈推薦使用。如果你沒有設定該屬性,那麼應用會使用預設的名稱去儲存圖片到預設的路徑,通過intent.getData()方法去獲取圖片內容
舉個例子演示如何構造一個影象捕獲意圖並去執行它
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
當執行startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);方法後,會啟動一個Camera介面,當我們結束拍照後,我們要在onActivityResult()方法中進行結果處理(下面有如何處理結果的講解,Receiving camera intent result)
視訊捕獲Intent
視訊捕捉的Intent可以包括以下額外的資訊
MediaStore.EXTRA_OUTPUT(同上)
MediaStore.EXTRA_VIDEO_QUALITY
取值範圍0~1,視訊質量和檔案大小
MediaStore.EXTRA_DURATION_LIMIT
視訊的時長,單位秒
MediaStore.EXTRA_SIZE_LIMIT
視訊檔案的大小,單位byte
舉個例子演示如何構造一個視訊捕獲意圖並去執行它
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//create new Intent
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); // create a file to save the video
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent
startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
當執行startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);方法後,會啟動一個Camera介面,當我們結束錄影後,我們要在onActivityResult()方法中進行結果處理(下面有如何處理結果的講解,Receiving camera intent result)
接收Intent返回結果並處理
舉個例子去講解如何重寫onActivityResult()進行處理從image camera intent或者video camera intent中返回的結果
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}