編寫:kesenhoo - 原文:http://developer.android.com/training/camera/videobasics.html
這節(jié)課會(huì)介紹如何使用已有的相機(jī)應(yīng)用來錄制視頻。
假設(shè)在我們應(yīng)用的所有功能當(dāng)中,整合視頻只是其中的一小部分,我們想要以最簡(jiǎn)單的方法錄制視頻,而不是重新實(shí)現(xiàn)一個(gè)攝像機(jī)組件。幸運(yùn)的是,大多數(shù)Android設(shè)備已經(jīng)安裝了一個(gè)能錄制視頻的相機(jī)應(yīng)用。在本節(jié)課當(dāng)中,我們將會(huì)讓它為我們完成這一任務(wù)。
為了讓用戶知道我們的應(yīng)用依賴照相機(jī),在Manifest清單文件中添加<uses-feature>
標(biāo)簽:
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
如果應(yīng)用使用相機(jī),但相機(jī)并不是應(yīng)用正常運(yùn)行所必不可少的組件,可以將android:required
設(shè)置為"false"
。這樣的話,Google Play 也會(huì)允許沒有相機(jī)的設(shè)備下載該應(yīng)用。當(dāng)然我們有必要在使用相機(jī)之前通過調(diào)用hasSystemFeature(PackageManager.FEATURE_CAMERA)方法來檢查設(shè)備上是否有相機(jī)。如果沒有,那么和相機(jī)相關(guān)的功能應(yīng)該禁用!
利用一個(gè)描述了執(zhí)行目的的Intent對(duì)象,Android可以將某些執(zhí)行任務(wù)委托給其他應(yīng)用。整個(gè)過程包含三部分: Intent 本身,一個(gè)函數(shù)調(diào)用來啟動(dòng)外部的 Activity,當(dāng)焦點(diǎn)返回到Activity時(shí),處理返回圖像數(shù)據(jù)的代碼。
下面的函數(shù)將會(huì)發(fā)送一個(gè)Intent來錄制視頻
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);
}
}
注意在調(diào)用startActivityForResult()方法之前,先調(diào)用resolveActivity(),這個(gè)方法會(huì)返回能處理該Intent的第一個(gè)Activity(譯注:即檢查有沒有能處理這個(gè)Intent的Activity)。執(zhí)行這個(gè)檢查非常重要,因?yàn)槿绻谡{(diào)用startActivityForResult()時(shí),沒有應(yīng)用能處理你的Intent,應(yīng)用將會(huì)崩潰。所以只要返回結(jié)果不為null,使用該Intent就是安全的。
Android的相機(jī)程序會(huì)把指向視頻存儲(chǔ)地址的Uri添加到Intent中,并傳送給onActivityResult()方法。下面的代碼獲取該視頻并顯示到一個(gè)VideoView當(dāng)中:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
Uri videoUri = intent.getData();
mVideoView.setVideoURI(videoUri);
}
}