Android多媒体开发:照相机
一、調(diào)用系統(tǒng)照相機(jī)和攝像機(jī)功能
調(diào)用系統(tǒng)攝像頭進(jìn)行拍照和攝像是通過隱式啟動(dòng)系統(tǒng)Activity 實(shí)現(xiàn)的,無需給自己的工程添加權(quán)限,直接調(diào)用即可。因此我們只需知道系統(tǒng)照相機(jī)和攝像機(jī)Activity 的action 和category 就可以了
步驟
1、打開Android 源碼,查看”\packages\apps\”文件文件目錄下的Camera 應(yīng)用,即系統(tǒng)攝像頭的應(yīng)用程序。打開其清單文件文件,查看其Activity 的action 和category 信息
2、Camera 類的action 和category 如下
照相機(jī)的意圖過濾器
<intent-filter><action android:name="android.media.action.IMAGE_CAPTURE" /><category android:name="android.intent.category.DEFAULT" /> </intent-filter>攝像機(jī)的意圖過濾器
<intent-filter><action android:name="android.media.action.VIDEO_CAMERA" /><category android:name="android.intent.category.DEFAULT" /> </intent-filter>3、采用隱式調(diào)用的方式調(diào)用Activity
由于希望在調(diào)用拍照或攝像功能后將結(jié)果返回到當(dāng)前應(yīng)用的Activity,所以在開啟Activity 時(shí)不能使用startActivity 方法,而是使用startActivityForResult 方法開啟Activity,并重寫onActivityResult 方法處理回傳的數(shù)據(jù)
布局文件比較簡單,界面只有兩個(gè)按鈕,一個(gè)用于打開照相機(jī),一個(gè)用于打開攝像機(jī)。這里只給出核心代碼清單
拍照功能核心代碼
public void take(View view){//創(chuàng)建一個(gè)Intent 對(duì)象Intent intent = new Intent();//設(shè)置Actionintent.setAction("android.media.action.IMAGE_CAPTURE");//創(chuàng)建一個(gè)文件File file = newFile(Environment.getExternalStorageDirectory().getAbsolutePath(),"my.jpg");//創(chuàng)建uri 對(duì)象Uri uri = Uri.fromFile(file);//設(shè)置圖片的輸出路徑intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//開啟ActivitystartActivityForResult(intent, 100);}攝像功能核心代碼
public void video(View view){Intent intent = new Intent();intent.setAction("android.media.action.VIDEO_CAPTURE");File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"myVedio.mp4");Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, 101); }二、編碼實(shí)現(xiàn)照相功能
使用Camera+SurfaceView 控件可實(shí)現(xiàn)自定義照相機(jī)功能。接下來我將具體的步驟展示出來
1、編寫布局文件,該布局只有一個(gè)SurfaceView 控件和一個(gè)Button 作為拍照按鈕
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><SurfaceView android:id="@+id/sv"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><Button android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="takeImage"android:text="拍照"/></LinearLayout>2、在清單文件中添加2 個(gè)權(quán)限信息
添加第一個(gè)權(quán)限是因?yàn)槲覀兇a使用到系統(tǒng)照相機(jī),第二個(gè)是因?yàn)槲覀冃枰颜蘸玫南嗥4娴絪dcard 上
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> //聲明成員變量private Camera camera;//照相機(jī)對(duì)象private SurfaceHolder holder;//SurfaceView 的輔助類//獲取SurfaceView 控件的實(shí)例,通過其輔助類SurfaceHolder 對(duì)象添加CallBack 接口的實(shí)現(xiàn)//獲取預(yù)覽畫面的SurfaceView 控件SurfaceView surfaceView = (SurfaceView) findViewById(R.id.sv);//得到預(yù)覽畫面的輔助類holder = surfaceView.getHolder();//添加回調(diào)方法holder.addCallback(new Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {//打開攝像頭camera = Camera.open();//設(shè)置預(yù)覽顯示的位置camera.setPreviewDisplay(holder);//開啟預(yù)覽camera.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//停止預(yù)覽界面camera.stopPreview();//釋放攝像頭camera.release();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {}//添加點(diǎn)擊拍照按鈕的點(diǎn)擊事件:設(shè)置攝像頭自動(dòng)對(duì)焦,對(duì)焦完成后保存圖片并重新預(yù)覽//拍照public void takeImage(View view) {if (camera == null) {Toast.makeText(this, "照相機(jī)還沒打開。", Toast.LENGTH_SHORT).show();return;}//點(diǎn)擊拍照按鈕,攝像頭自動(dòng)對(duì)焦,對(duì)焦完成后拍照并保存camera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {//對(duì)焦完成,拍照并保存camera.takePicture(null, null, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//設(shè)置照片保存路徑String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +UUID.randomUUID().toString() + ".jpg";try {FileOutputStream outputStream = new FileOutputStream(path);//將照片字節(jié)數(shù)組寫到文件中outputStream.write(data);outputStream.close();//重新開啟預(yù)覽camera.startPreview();} catch (Exception e) {e.printStackTrace();}}});}});}三、總結(jié)
Camera
| open() | 打開攝像頭 |
| release() | 釋放攝像頭 |
| setPreviewDisplay() | 設(shè)置預(yù)覽顯示的位置 |
| startPreview() | 開啟預(yù)覽 |
| stopPreview() | 停止預(yù)覽界面 |
| autoFocus() | AutoFocusCallback |
| takePicture() | 對(duì)焦完成 |
總結(jié)
以上是生活随笔為你收集整理的Android多媒体开发:照相机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android多媒体开发
- 下一篇: Android多媒体开发:录音机