版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
AndroidCamera開發(fā)(一)之基礎(chǔ)知識(shí)概述Android手機(jī)關(guān)于Camera的使用,一是拍照,二是攝像,由于Android提供了強(qiáng)大的組件功能,為此對(duì)于在Android手機(jī)系統(tǒng)上進(jìn)行Camera的開發(fā),我們可以使用兩類方法:一是借助Intent和MediaStore調(diào)用系統(tǒng)CameraApp程序來(lái)實(shí)現(xiàn)拍照和攝像功能,二是根據(jù)CameraAPI自寫Camera程序?;A(chǔ)知識(shí)Android系統(tǒng)提供API來(lái)支持自定義相機(jī)拍照和系統(tǒng)拍照,以下是有關(guān)的類:Camera該類提供基礎(chǔ)API來(lái)使用設(shè)備上的相機(jī),且該類可以為你的應(yīng)用提供拍照和錄像相關(guān)的API。SurfaceView該類用于顯示相機(jī)的預(yù)覽數(shù)據(jù)。如果你對(duì)SurfaceView還不熟悉,請(qǐng)參考AndroidSurfaceView的使用這篇文章。MediaRecorder該類提供相機(jī)錄像相關(guān)的API。注意事項(xiàng)在你的應(yīng)用程序能夠在Android設(shè)備上使用相機(jī)之前,你應(yīng)該考慮幾個(gè)問(wèn)題,那就是你的App打算如何使用相機(jī)拍照或者錄像?Camera需求的聲明:使用相機(jī)功能對(duì)于你的應(yīng)用程序來(lái)說(shuō)是否很重要并且你不希望你的應(yīng)用程序被安裝在沒(méi)有相機(jī)的機(jī)器上?如果是這樣,那么你需要把相機(jī)需求聲明在配置文件里。調(diào)用系統(tǒng)拍照還是自定義相機(jī):你的應(yīng)用程序該如何使用相機(jī)?你是否僅僅需要拍攝一張照片或者一個(gè)視頻,或者你的應(yīng)用程序希望提供一種使用相機(jī)的新的方式?存儲(chǔ):是否你的應(yīng)用生成的圖片和視頻僅對(duì)你的應(yīng)用可見,還是其他應(yīng)用程序例如相冊(cè)或者其他的多媒體和社交App也可以使用它們?你是否希望你的應(yīng)用程序被卸載后,這些照片和視頻仍然可用,還是一起被刪除?權(quán)限申明CameraPermission-你的應(yīng)用必須申請(qǐng)相機(jī)權(quán)限才可以使用設(shè)備相機(jī)。<uses-permissionandroid:name="android.permission.CAMERA"/>注意:如果你使用Intent調(diào)用系統(tǒng)相機(jī),你的應(yīng)用無(wú)需申請(qǐng)?jiān)摍?quán)限。StoragePermission-如果你的應(yīng)用需要保存照片或者視頻到設(shè)備存儲(chǔ)中,你必須在Manifest指定文件的寫權(quán)限<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>AudioRecordingPermission-你必須申請(qǐng)錄音權(quán)限才能使用相機(jī)來(lái)錄像.<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>LocationPermission-當(dāng)然如果你需要拍攝的照片記錄地理位置,你同樣需要申請(qǐng)如下權(quán)限<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>調(diào)用系統(tǒng)相機(jī)你的應(yīng)用可以通過(guò)發(fā)送一個(gè)Intent到系統(tǒng)相機(jī)應(yīng)用來(lái)實(shí)現(xiàn)抓取一張照片或者一段視頻剪輯,然后將它們返回給你的應(yīng)用。使用cameraintent調(diào)用系統(tǒng)相機(jī)流程如下:(1)ComposeaCameraIntent-創(chuàng)建一個(gè)Intent請(qǐng)求用來(lái)拍照或者錄像,有關(guān)的Intent類型如下:MediaStore.ACTION_IMAGE_CAPTURE-該Intentaction類型用于請(qǐng)求系統(tǒng)相機(jī)拍照。MediaStore.ACTION_VIDEO_CAPTURE-該Intentaction類型用于請(qǐng)求系統(tǒng)相機(jī)錄像。(2)StarttheCameraIntent-調(diào)用activity的startActivityForResult()方法來(lái)發(fā)送cameraintent請(qǐng)求拍照或者錄像,當(dāng)發(fā)送cameraintent以后,當(dāng)前應(yīng)用會(huì)跳轉(zhuǎn)到系統(tǒng)相機(jī)應(yīng)用app界面,讓用戶可以拍照或者錄像。(3)ReceivetheIntentResult-在你的應(yīng)用中實(shí)現(xiàn)onActivityResult()回調(diào)方法去接收來(lái)自系統(tǒng)相機(jī)的拍攝結(jié)果。該方法在用戶完成拍照或者錄像以后由系統(tǒng)調(diào)用。系統(tǒng)拍照代碼如下,按上面的三步走:button1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}});...@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);/***通過(guò)data取得數(shù)據(jù)*/if(requestCode==CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){Bundleextras=data.getExtras();Bitmapbitmap=(Bitmap)extras.get("data");image.setImageBitmap(bitmap);}}但是,現(xiàn)在手機(jī)像素這么高,萬(wàn)一圖片特別大呢,會(huì)不會(huì)data過(guò)大而FC呢?放心,Android早就考慮到了,所以,data里面壓根就不是完整的圖片,它只是一張縮略圖。所以,我們需要獲取到拍攝的原圖,就不能使用這種方法。但是我們可以這樣做,我們可以指定MediaStore類的一個(gè)EXTRA_OUTPUT來(lái)指定拍攝圖像保存的位置,相當(dāng)于建立一個(gè)臨時(shí)文件。在onActivityResult中,我們不使用data來(lái)獲取圖像,而是直接去讀這個(gè)臨時(shí)文件即可。如果自己代碼指定了保存圖片的uri,data里面就不會(huì)保存數(shù)據(jù)。button1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);UrifileUri=getOutputMediaFileUri(MEDIA_TYPE_IMAGE);intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);}});...@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){/***通過(guò)存儲(chǔ)Uri取得數(shù)據(jù)*/if(requestCode==CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){if(resultCode==RESULT_OK){image.setImageURI(getOutputMediaFileUri(MEDIA_TYPE_IMAGE));}}}這樣我們就可以獲取到完整的拍攝圖片了。后面你可以讓圖像顯示出來(lái)。下面來(lái)看看保存多媒體文件:拍照或者錄像生成的多媒體文件需要保存到手機(jī)存儲(chǔ)目錄中(SDCard),所以在應(yīng)用中必須有往手機(jī)中寫文件的權(quán)限。一般可以有多種本地路徑來(lái)保存多媒體文件,但是主要有如下兩種常用的路徑:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)該方法返回一個(gè)標(biāo)準(zhǔn)的外部存儲(chǔ)路徑去保存照片和視頻。這個(gè)路徑是公共的,所以其他應(yīng)用也可以訪問(wèn),修改,刪除該路徑下的照片和視頻,如果你的應(yīng)用被卸載了,媒體文件依然存在本地儲(chǔ)存中。為了避免和其他多媒體文件混淆,你應(yīng)該在公共目錄下創(chuàng)建一個(gè)子目錄來(lái)保存你自己應(yīng)用中的多媒體數(shù)據(jù)。Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)該方法返回一個(gè)標(biāo)準(zhǔn)的,唯獨(dú)當(dāng)前應(yīng)用自己可見的路徑去保存照片和視頻。如果該應(yīng)用被卸載,在該目錄下的所有多媒體數(shù)據(jù)將會(huì)被移除。但是有一個(gè)好處就是其他應(yīng)用無(wú)法去訪問(wèn),修改,刪除該路徑下的文件。如下示例代碼演示如何創(chuàng)建一個(gè)路徑用來(lái)保存照片和視頻:publicstaticfinalintMEDIA_TYPE_IMAGE=1;publicstaticfinalintMEDIA_TYPE_VIDEO=2;/**CreateafileUriforsavinganimageorvideo*/privatestaticUrigetOutputMediaFileUri(inttype){returnUri.fromFile(getOutputMediaFile(type));}/**CreateaFileforsavinganimageorvideo*/privatestaticFilegetOutputMediaFile(inttype){FilemediaStorageDir=newFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"WatsonCamera");if(!mediaStorageDir.exists()){if(!mediaStorageDir.mkdirs()){returnnull;}}FilemediaFile;if(type==MEDIA_TYPE_IMAGE){mediaFile=newFile(mediaStorageDir.getPath()+File.separator+"IMG_watson.jpg");}elseif(type==MEDIA_TYPE_VIDEO){mediaFile=newFile(mediaStorageDir.getPath()+File.separator+"VID_watson.mp4");}else{returnnull;}returnmediaFile;}系統(tǒng)錄像發(fā)送Intent錄像攜帶的外部數(shù)據(jù)extra的信息如下:MediaStore.EXTRA_OUTPUT該關(guān)鍵字和拍照使用的關(guān)鍵字一樣,意思就是制定一個(gè)路徑和文件名來(lái)構(gòu)建一個(gè)Uri對(duì)象來(lái)保存錄像結(jié)果。MediaStore.EXTRA_VIDEO_QUALITY該關(guān)鍵字用于指定拍攝的錄像質(zhì)量,參數(shù)0表示低質(zhì)量,參數(shù)1表示高質(zhì)量。MediaStore.EXTRA_DURATION_LIMIT該關(guān)鍵之用于指定拍攝的錄像的時(shí)間限制,單位是秒。MediaStore.EXTRA_SIZE_LIMIT該關(guān)鍵字用于指定拍攝的錄像文件大小限制,單位值byte。代碼如下,按上面的三步走:button2.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MediaStore.ACTION_VIDEO_CAPTURE);UrifileUri=getOutputMediaFileUri(MEDIA_TYPE_VIDEO);intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);startActivityForResult(intent,CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);}});...@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(requestCode==CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){if(resultCode==RESULT_OK){image.setVisibility(View.VISIBLE);video.setVisibility(View.GONE);image.setImageURI(getOutputMediaFileUri(MEDIA_TYPE_IMAGE));}}elseif(requestCode==CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE){if(resultCode==RESULT_OK){video.setVisibility(View.VISIBLE);image.setVisibility(View.GONE);video.setVideoURI(getOutputMediaFileUri(MEDIA_TYPE_VIDEO));video.setOnPreparedListener(newMediaPlayer.OnPreparedListener(){@OverridepublicvoidonPrepared(MediaPlayermp){video.start();}});video.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){@OverridepublicvoidonCompletion(MediaPlayermp){if(null!=video){video.stopPlayback();}}});}}}自定義相機(jī)創(chuàng)建一個(gè)自定義的相機(jī)app基本遵循如下步驟:檢測(cè)和訪問(wèn)相機(jī):首先代碼檢測(cè)該設(shè)備相機(jī)是否存在,如果存在才能請(qǐng)求訪問(wèn)設(shè)備相機(jī)。創(chuàng)建一個(gè)預(yù)覽來(lái)顯示相機(jī)圖像:在你的布局中使用SurfaceView控件,然后在代碼中繼承SurfaceHolder.Callback接口并且實(shí)現(xiàn)接口中的方法來(lái)顯示來(lái)自相機(jī)的圖像信息。設(shè)置相機(jī)基本參數(shù):根據(jù)需求設(shè)置相機(jī)預(yù)覽尺寸,圖片大小,預(yù)覽方向,圖片方向等。設(shè)置拍照錄像監(jiān)聽:當(dāng)用戶按下按鈕時(shí)調(diào)用Camera.takePicture()或者M(jìn)ediaRecorder.start()來(lái)進(jìn)行拍照或錄像。文件保存:當(dāng)拍照結(jié)束或者錄像視頻結(jié)束時(shí),需要開啟一個(gè)后臺(tái)線程去保存圖片或者視頻文件。釋放相機(jī)資源:Camera硬件是一個(gè)共享資源,所以你必須小心的編寫你的應(yīng)用代碼來(lái)管理相機(jī)資源。一般在Activity的生命周期的onResume中開啟相機(jī),在onPause中釋放相機(jī)。注意:當(dāng)你不在使用相機(jī)資源時(shí),記得調(diào)用Camera.release()方法來(lái)釋放相機(jī)資源,否則其他應(yīng)用甚至你自己的應(yīng)用再次請(qǐng)求訪問(wèn)設(shè)備相機(jī)時(shí)會(huì)失敗,并且crash。檢測(cè)相機(jī)硬件是否存在一般情況,我們會(huì)在運(yùn)行代碼時(shí)檢測(cè)該設(shè)備是否有相機(jī)硬件,如果有相機(jī)硬件,才進(jìn)一步去訪問(wèn)相機(jī),如下是檢測(cè)相機(jī)硬件是否存在是代碼示例:/**Checkifthisdevicehasacamera*/privatebooleancheckCameraHardware(Contextcontext){if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){returntrue;}else{returnfalse;}}Android設(shè)備可以有多個(gè)相機(jī)硬件,現(xiàn)在一般手機(jī)都是前后兩個(gè)camera,因此我們?cè)贏ndroid2.3以后也可以使用Camera.getNumberOfCameras()方法來(lái)獲得當(dāng)前設(shè)備camera個(gè)數(shù)來(lái)判斷相機(jī)硬件是否存在。創(chuàng)建Camera預(yù)覽Camera預(yù)覽布局文件:<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/record_navigation_bar"android:layout_width="match_parent"android:layout_height="48dp"android:background="#F8F8F8"><ImageViewandroid:id="@+id/record_act_back"android:layout_width="25dp"android:layout_height="31dp"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:src="@drawable/icon_ll_back"/></RelativeLayout><SurfaceViewandroid:id="@+id/camera_preview"android:layout_width="match_parent"android:layout_height="fill_parent"android:layout_above="@+id/record_bottom_bar"android:layout_below="@+id/record_navigation_bar"/><RelativeLayoutandroid:id="@+id/record_bottom_bar"android:layout_width="match_parent"android:layout_height="60dp"android:layout_alignParentBottom="true"android:background="@drawable/recording_bottom_bar_bg_interview"><Buttonandroid:id="@+id/btn_start_recording"android:layout_width="58dp"android:layout_height="58dp"android:layout_centerInParent="true"android:background="@drawable/recording_act_vedio_start"/><Buttonandroid:id="@+id/btn_change_module"android:layout_width="45dp"android:layout_height="35dp"android:layout_centerVertical="true"android:layout_marginLeft="30dp"android:background="@drawable/change_module_photo"/></RelativeLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="30dp"android:layout_alignParentRight="true"android:layout_below="@+id/record_navigation_bar"android:layout_marginRight="10dp"android:layout_marginTop="10dp"android:gravity="center_vertical"><Viewandroid:id="@+id/record_video_tip"android:layout_width="15dp"android:layout_height="15dp"android:layout_marginRight="10dp"android:background="@drawable/record_video_tip"/><TextViewandroid:id="@+id/record_video_time"android:layout_width="wrap_content"android:layout_height="30dp"android:layout_marginRight="10dp"android:gravity="center_vertical"android:text="00:00"android:textColor="@android:color/white"android:textSize="17sp"/></LinearLayout></RelativeLayout>然后,我們創(chuàng)建一個(gè)Activity,用來(lái)展示Camera的預(yù)覽,那么在這個(gè)Activity里面,我們需要做什么呢??jī)杉虑椋撼跏蓟鄼C(jī)將內(nèi)容顯示到SurfaceViewAndroid的Camera是獨(dú)享的,如果多處調(diào)用,就會(huì)拋出異常,所以,我們需要將Camera的生命周期與SurfaceView的生命周期綁定:surfaceCreated方法中初始化相機(jī)surfaceDestroyed方法中釋放相機(jī)初始化相機(jī)非常簡(jiǎn)單:privateCameragetCamera(){Cameracamera;try{camera=Camera.open();}catch(Exceptione){camera=null;}returncamera;}注意:在調(diào)用Camera.open()方法時(shí)總是要去捕獲一個(gè)異常,以免打開相機(jī)設(shè)備失敗導(dǎo)致整個(gè)應(yīng)用crash。在Android2.3以及更高api上,你可以使用Camera.open(int)來(lái)打開指定的相機(jī)。以上代碼示例總是默認(rèn)打開后置camera,一般情況參數(shù)為0表示打開后置camera,參數(shù)為1表示打開前置camera。釋放相機(jī)也非常簡(jiǎn)單:@OverridepublicvoidsurfaceDestroyed(SurfaceHolderholder){if(camera!=null){try{camera.setPreviewCallback(null);camera.stopPreview();camera.release();camera=null;}catch(Exceptione){e.printStackTrace();}}}那么下面我們?cè)賮?lái)看如何把相機(jī)圖像設(shè)置到SurfaceView中進(jìn)行預(yù)覽:@OverridepublicvoidsurfaceCreated(SurfaceHolderholder){try{camera=getCamera();camera.setPreviewDisplay(holder);//camera關(guān)聯(lián)到SurfaceViewcamera.setDisplayOrientation(90);//旋轉(zhuǎn)90度camera.startPreview();//開始預(yù)覽}catch(Exceptione){finish();}}是不是也非常簡(jiǎn)單,camera的一個(gè)方法已經(jīng)幫我們自動(dòng)關(guān)聯(lián)了SurfaceView。這里需要注意下這個(gè)方法camera.setDisplayOrientation(90),通過(guò)這個(gè)方法,我們可以調(diào)整攝像頭的角度,不然默認(rèn)是橫屏,圖像會(huì)顯示的比較奇怪。當(dāng)然,即使你設(shè)置了90,圖像也有可能比較奇怪,這是因?yàn)槟銢](méi)有對(duì)圖像進(jìn)行正確的縮放,比例不對(duì)。通過(guò)上面的設(shè)置,我們已經(jīng)可以正常預(yù)覽攝像頭的圖像內(nèi)容了。拍照一旦你創(chuàng)建了camerapreview并且加載到布局中可以實(shí)時(shí)顯示預(yù)覽畫面了,此時(shí)就可以進(jìn)行拍照了。為了配合拍照,我們需要做一些設(shè)置,設(shè)置拍照參數(shù),當(dāng)然你也可以不設(shè)置而使用默認(rèn)參數(shù),默認(rèn)參數(shù)基本上就能滿足我們的要求。Camera.Parametersparams=mCamera.getParameters();params.setPictureFormat(ImageFormat.JPEG);params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);mCamera.setParameters(params);//自動(dòng)聚焦camera.autoFocus(newAutoFocusCallback(){publicvoidonAutoFocus(booleansuccess,Cameracamera){if(success)System.out.println("聚焦成功!");elseSystem.out.println("聚焦失敗!");}});在代碼中你應(yīng)該實(shí)現(xiàn)一個(gè)監(jiān)聽回調(diào)來(lái)捕獲用戶拍照的行為??梢哉{(diào)用camera.takePciture()方法來(lái)進(jìn)行拍照。publicfinalvoidtakePicture(ShutterCallbackshutter,PictureCallbackraw,PictureCallbackjpeg);該方法接受三個(gè)參數(shù),第一個(gè)參數(shù)ShutterCallback響應(yīng)快門的接口,第二個(gè)參數(shù)PictureCallback接收raw格式的圖片數(shù)據(jù),第三個(gè)參數(shù)PictureCallback接收jpeg格式的圖片數(shù)據(jù)。為了保存圖片數(shù)據(jù),你可以根據(jù)需要實(shí)現(xiàn)以上三個(gè)接口。此處我們暫且實(shí)現(xiàn)第三個(gè)PictureCallback接口回調(diào)。示例代碼如下://拍照if(camera!=null){camera.takePicture(null,null,mPictureCallback);}//第三個(gè)PictureCallback接口回調(diào),通過(guò)data[]保持圖片數(shù)據(jù)信息privateCamera.PictureCallbackmPictureCallback=newCamera.PictureCallback(){@OverridepublicvoidonPictureTaken(byte[]data,Cameracamera){FilepictureFile=MainActivity.getOutputMediaFile(MEDIA_TYPE_IMAGE);if(pictureFile==null){return;}try{FileOutputStreamfos=newFileOutputStream(pictureFile);fos.write(ta);fos.close();}catch(Exceptione){e.printStackTrace();}Toast.makeText(RecordVedioAct.this,"圖像已保存",Toast.LENGTH_SHORT).show();camera.startPreview();//拍完繼續(xù)預(yù)覽}};錄像Camera視頻錄像不僅涉及到Camera類還用到了MediaRecorder類。當(dāng)你使用Camera錄像時(shí),你應(yīng)該調(diào)用Camera.lock()和Camera.unlock()來(lái)管理camera硬件,允許MediaRecorder訪問(wèn)camera硬件。你應(yīng)該在camera和MediaRecorder關(guān)聯(lián)之前調(diào)用Camera.unlock()來(lái)解鎖camera,允許MediaRecorder訪問(wèn)Camera,在釋放MediaRecorder資源以后調(diào)用Camera.lock()來(lái)鎖定camera以保證camera硬件資源的共享性。注:在Android4.0以后,系統(tǒng)會(huì)自動(dòng)管理camera.unlock()以及camera.lock(),無(wú)需用戶自己管理。啟動(dòng)錄像流程需要一個(gè)指定調(diào)用順序,如下是詳細(xì)的步驟流程:(1)OpenCamera–使用Camera.open()靜態(tài)方法來(lái)獲得camera對(duì)象實(shí)例。(2)ConnectPreview–使用camera.setPreviewDiaplay(holder)方法將相機(jī)的預(yù)覽畫面顯示在SurfaceView控件上。(3)StartPreview–使用camera.startPreview()方法開始啟動(dòng)預(yù)覽畫面。(4)StartRecordingVideo–必須完成以下步驟才能正常開始正常錄音:UnlocktheCamera-調(diào)用camera.unlock()方法解鎖camera,使得MediaRecorder進(jìn)程能訪問(wèn)Camera硬件。ConfigureMediaRecorder-在這一步,分別調(diào)用MediaRecorder類中如下方法來(lái)配置MediaRecorder:/**配置MediaRecorder*/recorder.setCamera(camera);//設(shè)置camera用于錄像recorder.setOutputFile(filePath);//設(shè)置輸出文件路徑recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//設(shè)置錄像音頻來(lái)源recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//設(shè)置錄像視頻來(lái)源recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//設(shè)置視頻的輸出格式recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//設(shè)置視頻的編碼格式recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//設(shè)置音頻的編碼格式/**輸出格式和編碼格式,對(duì)于Android2.2或者更高版本使用MediaRecorder.setProfile方法即可,使用方法CamcorderProfile.get()來(lái)獲得一個(gè)配置信息*/recorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));setPreviewDisplay(holder.getSurface())//為MediaRecorder指定預(yù)覽顯示注意:在這一步,你必須調(diào)用MediaRecorder類中的以上全部方法來(lái)配置MediaRecorder,否則你的應(yīng)用將無(wú)法正常錄像并且報(bào)錯(cuò)。由于錄像默認(rèn)設(shè)置了很多參數(shù),無(wú)需用戶太關(guān)心更細(xì)節(jié)的參數(shù)設(shè)置,但是如果需要在你的應(yīng)用中修改這些默認(rèn)參數(shù)設(shè)置,你可以使用如下方法來(lái)修改默認(rèn)參數(shù):recorder.setAudioEncodingBitRate();//設(shè)置音頻編碼的字節(jié)率recorder.setVideoEncodingBitRate();//設(shè)置視頻編碼的字節(jié)率recorder.setOrientationHint(tureAngle);//設(shè)置MediaRecorder旋轉(zhuǎn)角度recorder.setAudioSamplingRate();//設(shè)置音頻采樣率recorder.setMaxDuration(5*60*1000);//設(shè)置最大錄制時(shí)間recorder.setVideoSize(640,480);//設(shè)置視頻尺寸大小,在setVideoSource()和setOutFormat()之后recorder.setVideoFrameRate()//設(shè)置視頻幀率,在setVideoSource()和setOutFormat()之后recorder.setAudioChannels();//設(shè)置音頻的頻道數(shù)目,參數(shù)一般1/2PrepareMediaRecorder-在配置完MediaRecorder參數(shù)之后調(diào)用mediaRecorder.prepare()方法來(lái)準(zhǔn)備MediaRecorder。StartMediaRecorder-調(diào)用mediaRecorder.start()方法啟動(dòng)錄像。(5)StopRecordingVideo–當(dāng)你結(jié)束錄像時(shí)調(diào)用如下方法:StopMediaRecorder-首先調(diào)用mediaRecorder.stop()方法停止多媒體錄像。ResetMediaRecorder-調(diào)用mediaRecorder.reset()方法重置多媒體狀態(tài),調(diào)用該方法之后之前的所有MediaRecorderconfiguration將被移除,你如果還想再次錄像,需要再次配置多媒體參數(shù)。ReleaseMediaRecorder-調(diào)用mediaRecorder.release()方法釋放多媒體資源。LocktheCamera-調(diào)用camera.lock()方法來(lái)給Camera硬件加鎖。在Android4.0及以后無(wú)需調(diào)用該方法,除非在調(diào)用mediaRecorder.prepare()失敗時(shí),才需要再次調(diào)用該方法。(6)StopthePreview-當(dāng)你的Activity已經(jīng)不再使用camera時(shí),調(diào)用camera.stopPreview()方法來(lái)停止預(yù)覽。(7)ReleaseCamera-當(dāng)不再使用Camera時(shí),調(diào)用camera.release()方法來(lái)釋放camera,以便其他應(yīng)用可以使用camera資源。注意:當(dāng)完成一段視頻錄像時(shí),不要馬上去釋放camera資源或者停止當(dāng)前預(yù)覽,因?yàn)橛锌赡苡脩魰?huì)再次啟動(dòng)錄像操作。本文中將camera釋放操作放在surfaceDestroyed里面。如下代碼演示在button的點(diǎn)擊事件中去啟動(dòng)和停止視頻錄像操作:/**錄像*/if(isRecording){stopRecord();}else{startRecord();}//開始錄像privatevoidstartRecord(){if(prepareVideoRecorder()){
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度健康養(yǎng)生類產(chǎn)品包裝設(shè)計(jì)合同3篇
- 二零二五版租賃房屋租賃合同網(wǎng)絡(luò)安全保障協(xié)議4篇
- 2025年度集裝箱裝卸運(yùn)輸操作規(guī)范合同
- 二零二五年度民間個(gè)人借款合同金融創(chuàng)新服務(wù)細(xì)則
- 二零二五版農(nóng)業(yè)保險(xiǎn)代理服務(wù)合同范本8篇
- 2025年度房產(chǎn)抵押經(jīng)營(yíng)性貸款合同樣本
- 2025年南京住建部房屋租賃合同規(guī)范版
- 課題申報(bào)參考:面向微生物組中介效應(yīng)的群落水平關(guān)聯(lián)檢驗(yàn)方法研究
- 課題申報(bào)參考:美式“小多邊主義”沖擊下中國(guó)伙伴關(guān)系的升級(jí)與轉(zhuǎn)型研究
- 2025年木材銷售企業(yè)庫(kù)存管理服務(wù)合同
- 汽車修理廠管理方案
- 人教版小學(xué)數(shù)學(xué)一年級(jí)上冊(cè)小學(xué)生口算天天練
- 九年級(jí)上冊(cè)-備戰(zhàn)2024年中考?xì)v史總復(fù)習(xí)核心考點(diǎn)與重難點(diǎn)練習(xí)(統(tǒng)部編版)
- 三年級(jí)數(shù)學(xué)添括號(hào)去括號(hào)加減簡(jiǎn)便計(jì)算練習(xí)400道及答案
- 蘇教版五年級(jí)上冊(cè)數(shù)學(xué)簡(jiǎn)便計(jì)算300題及答案
- 澳洲牛肉行業(yè)分析
- 老客戶的開發(fā)與技巧課件
- 計(jì)算機(jī)江蘇對(duì)口單招文化綜合理論試卷
- 成人學(xué)士學(xué)位英語(yǔ)單詞(史上全面)
- KAPPA-實(shí)施方法課件
- GB/T 13813-2023煤礦用金屬材料摩擦火花安全性試驗(yàn)方法和判定規(guī)則
評(píng)論
0/150
提交評(píng)論