android 多媒體和相機詳解五
相機
Android框架架包含了各種相機和相機功能的支援,使你可以在你的應用中捕獲影象和視訊.本文件討論一個簡單快速的獲取影象和視訊的方法,並概述一個建立自定義使用者相機體驗的高階方法.
想一想
在使你的應用能使用裝置上的相機之前,你應該先想一想你的應用將來會如何使用此硬體.
Camera必須-相機是必須的,你不希望你的應用安裝到一個沒有相機的裝置上.你應該在manifest檔案中宣告需要相機.
快速影象或自定義特性-你的應用將如何使用相機?你僅僅是抓取一個快速圖片或視訊剪輯,還是提供一個新的使用方式?前者請考慮使用現有的相機應用.後者請閱讀後面的"建立一個相機應用"一節.
儲存-你的應用產生的影象和視訊要給自己看還是共享給其它應用?你想在你的應用被刪除後所建立的影象和視訊仍然存在嗎?請閱讀後面的"儲存媒體檔案"一節來學習如何實現這些操作.
基礎知識
Android框架支援通過CameraAPI或Cemeraintent來抓取影象和視訊.下面就是相關的類們:
Camera
此類是控制裝置相機的主要API.此類用於在建立相機應用時獲取圖片和視訊.
SurfaceView
此類為使用者提供camera的實時影象預覽.
MediaRecorder
此類用於從camera錄製視訊.
Intent
一個MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE型的intent,可以使用它來抓取影象或視訊,而不用操作Camera物件們.
Manifest中的宣告
在使用CameraAPI開發你的應用之前,你需保證在你的manifest
CameraPermission - 你的應用必須請求使用裝置相機的取限.
<uses-permissionandroid:name="android.permission.CAMERA" />
注:如果你通intent使用camera,你的應用不必請求此許可權.
CameraFeatures - 你的應用必須也要宣告要使用的相機特性,比如:
<uses-featureandroid:name="android.hardware.camera" />
對於相機特性列表,請見manifestFeatures Reference.
新增相機特性到你的manifest
如果你的應用要使用相機或相機的一些特性,但又不是必須的,你應該在manifest中指定這些需求,但把android:required屬性置為false:
<uses-featureandroid:name="android.hardware.camera"android:required="false" />
StoragePermission - 如果你的應用要儲存影象或視訊到外部儲存上(SD卡),你必須也宣告此許可權.
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
AudioRecording Permission - 在使用視訊捕獲裝置來錄製音訊時,你的應用必須請求音訊捕獲許可權.
<uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
使用現有的相機應用
一個不用寫程式碼來獲取圖片和視訊的快速方法是使用intent來呼叫現有的Androidcamera 應用.一個cameraintent呼叫現存的相機應用抓取圖片或視訊剪輯然後返回的你的應用.本節向你演示如何使用此技術獲取圖片和視訊.
呼叫一個相機intent,主要有以下步驟:
組建一個相機Intent– 建立一個請求圖片或視訊的Intent,使用以下intent型別中的一個:
MediaStore.ACTION_IMAGE_CAPTURE- 從已存在的相機應用中請求一個圖片.
MediaStore.ACTION_VIDEO_CAPTURE- 從已存在的相機應用中請求一個視訊.
啟動這個相機Intent-使用startActivityForResult()方法來執行相機intent.在你啟動intent後,相機應用的介面會出現在裝置螢幕上,然後使用者就可以用它來獲取圖片或視訊.
接收Intent結果-在你的應用中設定一個onActivityResult()方法來接收從相機intent來的回撥和資料.當用戶獲取了一個圖或視訊之後(或取消了操作),系統就會呼叫此方法.
影象獲取intent
使用相機intent獲取影象是使用最少程式碼獲取影象的捷逕.一個影象獲取intent包含以下額外資訊:
MediaStore.EXTRA_OUTPUT-此設定需要一個Uri物件,這個物件指定了一個儲存影象的路徑和檔名.此設定是可選的,但是強烈建議使用之.如果你沒有指定此值,相機應用就會把影象以預設的名字儲存到預設的位置.
下面的例子演示了形成一個影象獲取intent並執行的方法.此例子中的getOutputMediaFileUri()方法是引用的”儲存媒體檔案”一節中的例子程式碼.
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);
// 建立一個獲取影象的Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // 建立一個檔案來儲存影象
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // 設定影象檔名
// 開始影象獲取Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
當startActivityForResult()方法被執行,看到一個相機應用的介面.當用戶獲取了一個影象(或取消了操作),使用者介面返回到你的應用,你必須攔截onActivityResult()方法來接收intent的結果然後再繼續執行你的應用.
視訊獲取intent
使用相機intent獲取視訊是使用最少程式碼使得你的應用獲取視訊的捷徑.一個視訊獲取intent可以包含以下額外資訊:
MediaStore.EXTRA_OUTPUT-此設定需要一個儲存視訊的路徑和檔名的Uri.此設定是可選的但是強列推薦的.如果你不指定此值,相機應用就把請求到的影象以預設的檔名儲存到預設的資料夾下,這些資訊儲存在返回的intent的Intent.getData()欄位中.
MediaStore.EXTRA_VIDEO_QUALITY- 此值在最低質量最小檔案尺寸時是0,在最高質量最大檔案尺寸時是1.
MediaStore.EXTRA_DURATION_LIMIT- 此值設定獲取視訊的長度,以秒為單位.
MediaStore.EXTRA_SIZE_LIMIT- 此值設定獲取視訊檔案的大小,以位元組為單位.
下面的例子演示瞭如何構建一個視訊獲取intent並執行它.此例子中的getOutputMediaFileUri()方法是引用的”儲存媒體檔案”一節中的例子程式碼.
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()方法執行後,使用者看到了一個改良的相機應用介面.在使用者完成視訊獲取(或取消了操作)之後,使用者介面返回到你的應用,你必須攔截onActivityResult()方法來接收intent的結果並且繼續執行你的應用.