android之相機開發?
在android中應用相機功能,一般有兩種:一種是直接調用系統相機,一種自己寫的相機。
我將分別演示兩種方式的使用:
第一種:是使用Intent跳轉到系統相機,action為:android.media.action.STILL_IMAGE_CAMERA
關鍵代碼:
- Intent?intent?=?new?Intent();?//調用照相機??????
- intent.setAction("android.media.action.STILL_IMAGE_CAMERA");??????
- startActivity(intent);??????
例子:
- import?android.app.Activity;??????
- import?android.content.Intent;??????
- import?android.os.Bundle;??????
- public?class?CameraTest_2?extends?Activity?{??????
- ????/**?Called?when?the?activity?is?first?created.?*/??????
- ????@Override??????
- ????public?void?onCreate(Bundle?savedInstanceState)?{??????
- ????????super.onCreate(savedInstanceState);??????
- ????????setContentView(R.layout.main);??????
- ????????Intent?intent?=?new?Intent();?//調用照相機??????
- ?????????intent.setAction("android.media.action.STILL_IMAGE_CAMERA");???????
- ????????startActivity(intent);??????
- ????}??????
- }??????
想要測試的,可以直接新建一個項目,并且把主activity的代碼換成上面的,然后運行,我測試了一下,上面這個代碼并不
需要權限,畢竟只是調用系統自帶的程序。
當然網上還有一些其他相關的調用方法,只要設置對了action,那么系統就會調用系統自帶的相機.
第二種:
(1)首先我們要自己創建一個照相界面,必須考慮用什么控件顯示照相機中的預覽效果,顯然android已經幫我們做好了選擇,那就是SurfaceView
控制SurfaceView需要一個surfaceHolder,他是系統提供的一個用來設置SurfaceView的一個對象,可以通過surfaceView.getHolder()這個方法來獲得.
Camera提供一個setPreviewDisplay(SurfaceHolder)的方法來連接surfaceHolder,并通過他來控制surfaceView.
而我們則使用android的Camera類提供了startPreview()和stopPreview()來開啟和關閉預覽.
關系如下:
Camera -- -->SurfaceHolder------>SurfaceView.
(2)知道怎么預覽了,當然也要知道怎么開啟相機.Camera.open()這是個靜態方法,如果相機沒有別人用著,則會返回一個 相機引用,如果被人用著,則會拋出異常。很奇怪的是,這個方法,不能隨便放,如放在構造方法或者onCreate()方法中,都會照成沒有預覽效果.
(3)
SurfaceHolder.Callback,這是個holder用來顯示surfaceView 數據的接口,他分別必須實現3個方法
surfaceCreated()這個方法是surface 被創建后調用的
surfaceChanged()這個方法是當surfaceView發生改變后調用的
surfaceDestroyed()這個是當surfaceView銷毀時調用的.
surfaceHolde通過addCallBack()方法將響應的接口綁定到他身上.
surfaceHolder還必須設定一個setType()方法,查看api的時候,發現這個方法已經過時,但是不寫,又會報錯
(4)
我用以上知識寫了一個MySurfaceView類,他繼承于SurfaceView,并在里面實現了照相機的預覽功能.這個我覺得最簡單的照相機預覽代碼:
MySurfaceView.java:
- import?java.io.IOException;??????
- import?android.content.Context;??????
- import?android.graphics.PixelFormat;??????
- import?android.hardware.Camera;??????
- import?android.util.Log;??????
- import?android.view.SurfaceHolder;??????
- import?android.view.SurfaceView;??????
- public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
- ????SurfaceHolder?holder;??????
- ????Camera?myCamera;??????
- ????public?MySurfaceView(Context?context)??????
- ????{??????
- ????????super(context);??????
- ????????holder?=?getHolder();//獲得surfaceHolder引用??????
- ?????????holder.addCallback(this);??????
- ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
- ????}??
- ????@Override??????
- ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(myCamera?==?null)??????
- ????????{??????
- ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
- ????????????try?{??????
- ????????????????myCamera.setPreviewDisplay(holder);??????
- ????????????}?catch?(IOException?e)?{??????
- ????????????????//?TODO?Auto-generated?catch?block??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ????????}?????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
- ????????????int?height)?{??????
- ????????myCamera.startPreview();??????????????
- ????}??????
- ????????@Override??????
- ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????myCamera.stopPreview();//停止預覽??????
- ?????????myCamera.release();//釋放相機資源??????
- ?????????myCamera?=?null;??????
- ????????Log.d("ddd",?"4");????????
- ????}??????
- }??????
主activity代碼:
- import?android.app.Activity;??????
- import?android.os.Bundle;??????
- import?android.view.View;??????
- import?android.view.View.OnClickListener;??????
- public?class?CameraTest_3?extends?Activity??{??????
- ????/**?Called?when?the?activity?is?first?created.?*/??????
- ????MySurfaceView?mySurface;??????
- ????@Override??????
- ????public?void?onCreate(Bundle?savedInstanceState)?{??????
- ????????super.onCreate(savedInstanceState);??????
- ????????mySurface?=?new?MySurfaceView(this);??????
- ????????setContentView(mySurface);??????
- ????}??????
- }??????
而且必須給應用添加權限:
- <uses-permission?android:name="android.permission.CAMERA"></uses-permission>??
(5)能夠預覽了,接下來就是拍照了,拍照用到了一個camera.tackPiture()這個方法,這個方法,有三個參數分別是
ShutterCallBack shutter,PictureCallBack raw,PictureCallBack jpeg.
下面是對他們的實現
- private?ShutterCallback?shutter?=?new?ShutterCallback()?{??????
- ??????????
- ????@Override??????
- ????public?void?onShutter()?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????Log.d("ddd",?"shutter");??????????
- ????}??????
- };??????
- private?PictureCallback?raw?=?new?PictureCallback()?{??????
- ??????????
- ????@Override??????
- ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????Log.d("ddd",?"raw");????????
- ????}??????
- };??????
- private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
- ??????????
- ????@Override??????
- ????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????Log.d("ddd","jpeg");????????
- ????}??????
- };??????
當開始拍照時,會依次調用shutter的onShutter()方法,raw的onPictureTaken方法,jpeg的onPictureTaken方法.
三個參數的作用是shutter--拍照瞬間調用,raw--獲得沒有壓縮過的圖片數據,jpeg---返回jpeg的圖片數據
當你不需要對照片進行處理,可以直接用null代替.
注意,當調用camera.takePiture方法后,camera關閉了預覽,這時需要調用startPreview()來重新開啟預覽。
我用以上知識,加到上面的那個例子,就形成了下面的代碼:
MySurfaceView.java:
- package?jason.camera;??????
- import?java.io.IOException;??????
- import?android.content.Context;??????
- import?android.graphics.PixelFormat;??????
- import?android.hardware.Camera;??????
- import?android.hardware.Camera.PictureCallback;??????
- import?android.hardware.Camera.ShutterCallback;??????
- import?android.util.Log;??????
- import?android.view.SurfaceHolder;??????
- import?android.view.SurfaceView;??????
- public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
- ????SurfaceHolder?holder;??????
- ????Camera?myCamera;??????
- ????private?ShutterCallback?shutter?=?new?ShutterCallback()?{??????
- ??????????????
- ????????@Override??????
- ????????public?void?onShutter()?{??????
- ????????????//?TODO?Auto-generated?method?stub??????
- ????????????Log.d("ddd",?"shutter");??????
- ??????????????????
- ????????}??????
- ????};??????
- ????private?PictureCallback?raw?=?new?PictureCallback()?{??????
- ??????????????
- ????????@Override??????
- ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????????//?TODO?Auto-generated?method?stub??????
- ????????????Log.d("ddd",?"raw");??????
- ??????????????????
- ????????}??????
- ????};??????
- ????private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
- ??????????????
- ????????@Override??????
- ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????????//?TODO?Auto-generated?method?stub??????
- ????????????Log.d("ddd","jpeg");??????
- ??????????????????
- ????????}??????
- ????};??????
- ????public?MySurfaceView(Context?context)??????
- ????{??????
- ????????super(context);??????
- ????????holder?=?getHolder();//獲得surfaceHolder引用??????
- ?????????holder.addCallback(this);??????
- ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
- ????}??????
- ????public?void?tackPicture()??????
- ????{??????
- ????????myCamera.takePicture(null,null,null);??????
- ????}??????
- ????public?void?voerTack()??????
- ????{??????
- ????????myCamera.startPreview();??????
- ????}??????
- ????@Override??????
- ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
- ????????????int?height)?{??????
- ????????myCamera.startPreview();??????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(myCamera?==?null)??????
- ????????{??????
- ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
- ????????????try?{??????
- ????????????????myCamera.setPreviewDisplay(holder);??????
- ????????????}?catch?(IOException?e)?{??????
- ????????????????//?TODO?Auto-generated?catch?block??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ????????}?????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????myCamera.stopPreview();//停止預覽??????
- ?????????myCamera.release();//釋放相機資源??????
- ?????????myCamera?=?null;??????
- ??????????????????
- ????}??????
- }??????
主activity:
- import?android.app.Activity;??????
- import?android.os.Bundle;??????
- import?android.view.View;??????
- import?android.view.View.OnClickListener;??????
- public?class?CameraTest_3?extends?Activity?implements?OnClickListener??{??????
- ????/**?Called?when?the?activity?is?first?created.?*/??????
- ????MySurfaceView?mySurface;??????
- ????boolean?isClicked?=?false;??????
- ????@Override??????
- ????public?void?onCreate(Bundle?savedInstanceState)?{??????
- ????????super.onCreate(savedInstanceState);??????
- ????????mySurface?=?new?MySurfaceView(this);??????
- ????????setContentView(mySurface);??????
- ????????mySurface.setOnClickListener(this);??????
- ????}??????
- ????@Override??????
- ????public?void?onClick(View?v)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(!isClicked)??????
- ????????{??????
- ????????????mySurface.tackPicture();??????
- ????????????isClicked?=?true;??????
- ????????}else??????
- ????????{??????
- ????????????mySurface.voerTack();??????
- ????????????isClicked?=?false;??????
- ??????????????????
- ????????}??????
- ??????????????
- ????}??????
這樣就是實現了拍照的功能,那么怎樣要圖片保存呢?那么這是就需要在那個參數中的jpeg的
方法里面進行處理了,那個方法的data參數,就是相片的數據。
我們通過BitmapFactory.decodeByteArray(data, 0, data.length)來獲得圖片并通過io處理,將圖片保存到想要保存的位置
下面這段代碼,是將照片保存到/sdcard/wjh.jpg;并把一些沒有用到的代碼全部刪掉,剩下一些必須的代碼
- package?java.camera;??????
- import?java.io.BufferedInputStream;??????
- import?java.io.BufferedOutputStream;??????
- import?java.io.File;??????
- import?java.io.FileOutputStream;??????
- import?java.io.IOException;??????
- import?java.io.OutputStream;??????
- import?android.content.Context;??????
- import?android.graphics.Bitmap;??????
- import?android.graphics.BitmapFactory;??????
- import?android.graphics.PixelFormat;??????
- import?android.hardware.Camera;??????
- import?android.hardware.Camera.PictureCallback;??????
- import?android.hardware.Camera.ShutterCallback;??????
- import?android.util.Log;??????
- import?android.view.SurfaceHolder;??????
- import?android.view.SurfaceView;??????
- public?class?MySurfaceView?extends?SurfaceView?implements?SurfaceHolder.Callback{??????
- ????SurfaceHolder?holder;??????
- ????Camera?myCamera;??????
- ????private?PictureCallback?jpeg?=?new?PictureCallback()?{??????
- ??????????????
- ????????@Override??????
- ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????????//?TODO?Auto-generated?method?stub??????
- ????????????try??????
- ????????????{??????
- ????????????????Bitmap?bm?=?BitmapFactory.decodeByteArray(data,?0,?data.length);??????
- ????????????????File?file?=?new?File("/sdcard/wjh.jpg");??????
- ????????????????BufferedOutputStream?bos???????
- ????????????????=?new?BufferedOutputStream(new?FileOutputStream(file));??????
- ????????????????bm.compress(Bitmap.CompressFormat.JPEG,100,bos);??????
- ????????????????bos.flush();??????
- ????????????????bos.close();??????
- ????????????}catch(Exception?e)??????
- ????????????{??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ????????}??????
- ????};??????
- ????public?MySurfaceView(Context?context)??????
- ????{??????
- ????????super(context);??????
- ????????holder?=?getHolder();//獲得surfaceHolder引用??????
- ?????????holder.addCallback(this);??????
- ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//設置類型????????
- ????}??????
- ????public?void?tackPicture()??????
- ????{??????
- ????????myCamera.takePicture(null,null,jpeg);??????
- ????}??????
- ????public?void?voerTack()??????
- ????{??????
- ????????myCamera.startPreview();??????
- ????}??????
- ????@Override??????
- ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
- ????????????int?height)?{??????
- ????????myCamera.startPreview();??????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(myCamera?==?null)??????
- ????????{??????
- ????????????myCamera?=?Camera.open();//開啟相機,不能放在構造函數中,不然不會顯示畫面.??????
- ????????????try?{??????
- ????????????????myCamera.setPreviewDisplay(holder);??????
- ????????????}?catch?(IOException?e)?{??????
- ????????????????//?TODO?Auto-generated?catch?block??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ????????}?????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????myCamera.stopPreview();//停止預覽??????
- ????????myCamera.release();//釋放相機資源??????
- ????????myCamera?=?null;??????
- ????}??????
- }??????
注意,這是必須添加在sd卡上寫數據的權限
- <uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>??
(7)能夠拍照了,這下子要考慮如何讓圖片更好看了,這顯然是專業人士的強項,但是我們在程序上,也可以做一些處理,
向上面的那些,因為我直接把surfaceView當做整體布局,就可能出現屏幕被拉開了,不是很好看,所以這時,就可以不要把
surfaceView弄成整體布局,把他弄到一個布局管理器,再設置相關的參數.
這時需要注意的是有些參數不能隨便亂設
如以下代碼:
- Camera.Parameters?parames?=?myCamera.getParameters();//獲得參數對象??
- parames.setPictureFormat(PixelFormat.JPEG);//設置圖片格式??
- parames.setPreviewSize(640,480);//這里面的參數只能是幾個特定的參數,否則會報錯.(176*144,320*240,352*288,480*360,640*480)??
- myCamera.setParameters(parames);??
還有自動對焦,當然有些手機沒有這個功能,自動對焦是通過autoFocus()這個方法調用一個自動對焦的接口,并在里面進行處理。
注意,這個方法必須在startPreview()和stopPreview()中間。
AutoFocusCallback是自動對焦的接口,實現它必須實現public void onAutoFocus(boolean success, Camera camera)這個方法,
所以我們可以將拍照方法放在這里面,然后對焦后再進行拍攝。。效果會好很多。
注意自動對焦需要添加
- <uses-feature?android:name="android.hardware.camera.autofocus"?/>??
?
下面是主要代碼,直接貼出來了
- import?java.io.BufferedOutputStream;??????
- import?java.io.File;??????
- import?java.io.FileOutputStream;??????
- import?java.io.IOException;??????
- import?android.app.Activity;??????
- import?android.content.pm.ActivityInfo;??????
- import?android.graphics.Bitmap;??????
- import?android.graphics.BitmapFactory;??????
- import?android.graphics.PixelFormat;??????
- import?android.hardware.Camera;??????
- import?android.hardware.Camera.AutoFocusCallback;??????
- import?android.hardware.Camera.PictureCallback;??????
- import?android.os.Bundle;??????
- import?android.view.SurfaceHolder;??????
- import?android.view.SurfaceView;??????
- import?android.view.View;??????
- import?android.view.Window;??????
- import?android.view.SurfaceHolder.Callback;??????
- import?android.view.View.OnClickListener;??????
- public?class?CameraTest_4?extends?Activity?implements??????
- Callback,?OnClickListener,?AutoFocusCallback{??????
- ????SurfaceView?mySurfaceView;//surfaceView聲明??????
- ????SurfaceHolder?holder;//surfaceHolder聲明??????
- ????Camera?myCamera;//相機聲明??????
- ????String?filePath="/sdcard/wjh.jpg";//照片保存路徑??????
- ????boolean?isClicked?=?false;//是否點擊標識??????
- ????//創建jpeg圖片回調數據對象??????
- ????PictureCallback?jpeg?=?new?PictureCallback()?{??????
- ??????????????
- ????????@Override??????
- ????????public?void?onPictureTaken(byte[]?data,?Camera?camera)?{??????
- ????????????//?TODO?Auto-generated?method?stub??????
- ????????????try??????
- ????????????{//?獲得圖片??????
- ????????????Bitmap?bm?=?BitmapFactory.decodeByteArray(data,?0,?data.length);??????
- ????????????File?file?=?new?File(filePath);??????
- ????????????BufferedOutputStream?bos?=??????
- ????????????????new?BufferedOutputStream(new?FileOutputStream(file));??????
- ????????????bm.compress(Bitmap.CompressFormat.JPEG,?100,?bos);//將圖片壓縮到流中??????
- ????????????bos.flush();//輸出??????
- ????????????bos.close();//關閉??????
- ????????????}catch(Exception?e)??????
- ????????????{??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ??????????????????
- ????????}??????
- ????};??????
- ????/**?Called?when?the?activity?is?first?created.?*/??????
- ????@Override??????
- ????public?void?onCreate(Bundle?savedInstanceState)?{??????
- ????????super.onCreate(savedInstanceState);??????
- ????????requestWindowFeature(Window.FEATURE_NO_TITLE);//無標題?????????????????
- ????????//設置拍攝方向??????
- ????????this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);??????
- ????????setContentView(R.layout.main);??????
- ????????//獲得控件??????
- ????????mySurfaceView?=?(SurfaceView)findViewById(R.id.surfaceView1);??????
- ????????//獲得句柄??????
- ????????holder?=?mySurfaceView.getHolder();??????
- ????????//添加回調??????
- ????????holder.addCallback(this);??????
- ????????//設置類型??????
- ????????holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);??????
- ????????//設置監聽??????
- ????????mySurfaceView.setOnClickListener(this);??????
- ????}??????
- ????@Override??????
- ????public?void?surfaceChanged(SurfaceHolder?holder,?int?format,?int?width,??????
- ????????????int?height)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????//設置參數并開始預覽??????
- ????????Camera.Parameters?params?=?myCamera.getParameters();??????
- ????????params.setPictureFormat(PixelFormat.JPEG);??????
- ????????params.setPreviewSize(640,480);??????
- ????????myCamera.setParameters(params);??????
- ????????myCamera.startPreview();??????
- ??????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceCreated(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????//開啟相機??????
- ????????if(myCamera?==?null)??????
- ????????{??????
- ????????????myCamera?=?Camera.open();??????
- ????????????try?{??????
- ????????????????myCamera.setPreviewDisplay(holder);??????
- ????????????}?catch?(IOException?e)?{??????
- ????????????????//?TODO?Auto-generated?catch?block??????
- ????????????????e.printStackTrace();??????
- ????????????}??????
- ????????}??????
- ??????????????
- ????}??????
- ????@Override??????
- ????public?void?surfaceDestroyed(SurfaceHolder?holder)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????//關閉預覽并釋放資源??????
- ????????myCamera.stopPreview();??????
- ????????myCamera.release();??????
- ????????myCamera?=?null;??????
- ??????????????
- ????}??????
- ????@Override??????
- ????public?void?onClick(View?v)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(!isClicked)??????
- ????????{??????
- ????????????myCamera.autoFocus(this);//自動對焦??????
- ????????????isClicked?=?true;??????
- ????????}else??????
- ????????{??????
- ????????????myCamera.startPreview();//開啟預覽??????
- ????????????isClicked?=?false;??????
- ????????}??????
- ??????????????
- ????}??????
- ????@Override??????
- ????public?void?onAutoFocus(boolean?success,?Camera?camera)?{??????
- ????????//?TODO?Auto-generated?method?stub??????
- ????????if(success)??????
- ????????{??????
- ????????????//設置參數,并拍照??????
- ????????????Camera.Parameters?params?=?myCamera.getParameters();??????
- ????????????params.setPictureFormat(PixelFormat.JPEG);??????
- ????????????params.setPreviewSize(640,480);??????
- ????????????myCamera.setParameters(params);??????
- ????????????myCamera.takePicture(null,?null,?jpeg);??????
- ????????}??????
- ??????????????
- ????}??????
- }??????
main.xml:
- <linearlayout?xmlns:android="http://schemas.android.com/apk/res/android"?????
- ????androidrientation="vertical"??????
- ????android:layout_width="fill_parent"??????
- ????android:layout_height="fill_parent"??????
- ????>??????
- ????<surfaceview?android:id="@+id/surfaceView1"?????
- ?????android:layout_width="640px"??????
- ?????android:layout_height="480px"??????
- ?????android:layout_gravity="center">??????
AndroidManifest.xml:
- <?xml?version="1.0"?encoding="utf-8"?>????
- <manifest?xmlns:android="http://schemas.android.com/apk/res/android"????
- ??????package="com.wjh.camera"????
- ??????android:versionCode="1"????
- ??????android:versionName="1.0">????
- ????<uses-sdk?android:minSdkVersion="7"?/>????
- ????<uses-permission?android:name="android.permission.CAMERA"></uses-permission>????
- ????<uses-feature?android:name="android.hardware.camera.autofocus"?/>????
- ????????<uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>????
- ????<application?android:icon="@drawable/icon"?android:label="@string/app_name">????
- ????????<activity?android:name=".CameraTest_4"????
- ??????????????????android:label="@string/app_name">????
- ????????????<intent-filter>????
- ????????????????<action?android:name="android.intent.action.MAIN"?/>????
- ????????????????<category?android:name="android.intent.category.LAUNCHER"?/>????
- ????????????</intent-filter>????
- ????????</activity>????
- ????</application>????
- </manifest>????
?
PS:其實自己去實現相機的必要性不大,大部分應用都是直接調用系統的相機,畢竟相機是涉及到一些比較專業的成像知識.