本文實例講述了Android編程實現拍照功能的2種方法。分享給大家供大家參考,具體如下:
Android系統的照相功能,已實現2種方法,可供大家參考:
1. 調用系統攝像頭來拍照
首先,找到AndroidManifest.xml文件里加入用戶權限
<uses-permission android:name="android.permission.CAMERA"></uses-permission><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />
其次,在主類Java文件里加入2個控件(button和imageview),是用來觸發按鈕事件和顯示圖片的,純是個人愛好
final int TAKE_PICTURE = 1;//為了表示返回方法中辨識你的程序打開的相機
關鍵是這里:
是打開系統自帶相機,以下是處理拍照得到的數據,將數據保存下來
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == TAKE_PICTURE) { if (resultCode == RESULT_OK) { Bitmap bm = (Bitmap) data.getExtras().get("data"); img.setImageBitmap(bm);//想圖像顯示在ImageView視圖上,private ImageView img; File myCaptureFile = new File("sdcard/123456.jpg"); try { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); /* 采用壓縮轉檔方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 調用flush()方法,更新BufferStream */ bos.flush(); /* 結束OutputStream */ bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}這樣就能實現調用系統自帶的攝像頭了,很簡單的操作。
2. 自己寫程序來保存照片
照片格局文件lay.xml里要先進行這些定義
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"><LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="130px" android:paddingRight="200px" > <SurfaceView android:id="@+id/mSurfaceView1" android:visibility="visible" android:layout_width="320px" android:layout_height="240px"> </SurfaceView> </LinearLayout> </LinearLayout>
其中SurfaceView是用來進行預覽的,
在Oncreat函數里初始化一系列的值:
requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.lay);/* 取得屏幕解析像素 */DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);// mImageView01 = (ImageView) findViewById(R.id.myImageView1);/* 以SurfaceView作為相機Preview之用 */mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);/* 綁定SurfaceView,取得SurfaceHolder對象 */mSurfaceHolder01 = mSurfaceView01.getHolder();/* Activity必須實現SurfaceHolder.Callback */mSurfaceHolder01.addCallback(takephoto.this);/** 以SURFACE_TYPE_PUSH_BUFFERS(3)* 作為SurfaceHolder顯示類型* */mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
首先進行初始化照相機的功能函數和參數設置:
private Camera mCamera01;mCamera01 = Camera.open();/* 創建Camera.Parameters對象 */Camera.Parameters parameters = mCamera01.getParameters();/* 設置相片格式為JPEG */parameters.setPictureFormat(PixelFormat.JPEG);Log.i(TAG, "pic is jpeg");/* 指定preview的屏幕大小 */parameters.setPreviewSize(320, 240);Log.i(TAG, "pic pingmu fenbianlv");/* 設置圖片分辨率大小 */parameters.setPictureSize(1024, 768);Log.i(TAG, "pic tupian fenbianlv");/* 將Camera.Parameters設置予Camera */mCamera01.setParameters(parameters);/* setPreviewDisplay唯一的參數為SurfaceHolder */mCamera01.setPreviewDisplay(mSurfaceHolder01);/* 立即運行Preview */mCamera01.startPreview();
初始化成功后就可以進行拍照了,拍照函數依然是通過調用camera類的函數來實現
只需實現jpegCallback這個回調函數來就行解碼、保存即可,前2個參數可以直接設為null,不過系統一般會自動幫你把這些都寫進來的
private PictureCallback jpegCallback = new PictureCallback(){ public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle JPEG image data /* onPictureTaken傳入的第一個參數即為相片的byte */ Bitmap bm = BitmapFactory.decodeByteArray (_data, 0, _data.length); /* 創建新文件 */ picname = "sdcard/1234566.jpg";//要保存在哪里,路徑你自己設 File myCaptureFile = new File(picname); try { BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream(myCaptureFile)); /* 采用壓縮轉檔方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 調用flush()方法,更新BufferStream */ bos.flush(); /* 結束OutputStream */ bos.close(); /* 將拍照下來且存儲完畢的圖文件,顯示出來 */ //mImageView01.setImageBitmap(bm); /* 顯示完圖文件,立即重置相機,并關閉預覽 */ resetCamera(); } catch (Exception e) { Log.e(TAG, e.getMessage()); } }};拍照完了要重置照相機,然后可以繼續拍照
/* 相機重置 */private void resetCamera(){ if (mCamera01 != null && bIfPreview) { mCamera01.stopPreview(); /* 擴展學習,釋放Camera對象 */ mCamera01.release(); mCamera01 = null; bIfPreview = false; }}2種拍照方式的比較
①. 調用系統自帶的照相機,照片格式大小只有幾種選擇,照片拍出來比較大,而自己程序實現的話可以調節照片大小為任意尺寸,圖片的容量可以調節
②. 調用系統的簡單,而且外觀一般比自己設置的要好看
③. 調用系統的操作簡單、方便,不易出錯,自己編程的話需要注意,容易引起系統出錯意外終止
更多關于Android相關內容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結》、《Android圖形與圖像處理技巧總結》、《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
新聞熱點
疑難解答