Android編程實現(xiàn)拍照功能的2種方法分析
本文實例講述了Android編程實現(xiàn)拍照功能的2種方法。分享給大家供大家參考,具體如下:
Android系統(tǒng)的照相功能,已實現(xiàn)2種方法,可供大家參考:
1. 調(diào)用系統(tǒng)攝像頭來拍照
首先,找到AndroidManifest.xml文件里加入用戶權(quán)限
<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),是用來觸發(fā)按鈕事件和顯示圖片的,純是個人愛好
final int TAKE_PICTURE = 1; //為了表示返回方法中辨識你的程序打開的相機(jī)
關(guān)鍵是這里:
是打開系統(tǒng)自帶相機(jī),以下是處理拍照得到的數(shù)據(jù),將數(shù)據(jù)保存下來
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)); /* 采用壓縮轉(zhuǎn)檔方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 調(diào)用flush()方法,更新BufferStream */ bos.flush(); /* 結(jié)束OutputStream */ bos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
這樣就能實現(xiàn)調(diào)用系統(tǒng)自帶的攝像頭了,很簡單的操作。
2. 自己寫程序來保存照片
照片格局文件lay.xml里要先進(jìn)行這些定義
<?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是用來進(jìn)行預(yù)覽的,
在Oncreat函數(shù)里初始化一系列的值:
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.lay); /* 取得屏幕解析像素 */ DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // mImageView01 = (ImageView) findViewById(R.id.myImageView1); /* 以SurfaceView作為相機(jī)Preview之用 */ mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); /* 綁定SurfaceView,取得SurfaceHolder對象 */ mSurfaceHolder01 = mSurfaceView01.getHolder(); /* Activity必須實現(xiàn)SurfaceHolder.Callback */ mSurfaceHolder01.addCallback(takephoto.this); /* * 以SURFACE_TYPE_PUSH_BUFFERS(3) * 作為SurfaceHolder顯示類型 * */ mSurfaceHolder01.setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
首先進(jìn)行初始化照相機(jī)的功能函數(shù)和參數(shù)設(shè)置:
private Camera mCamera01; mCamera01 = Camera.open(); /* 創(chuàng)建Camera.Parameters對象 */ Camera.Parameters parameters = mCamera01.getParameters(); /* 設(shè)置相片格式為JPEG */ parameters.setPictureFormat(PixelFormat.JPEG); Log.i(TAG, "pic is jpeg"); /* 指定preview的屏幕大小 */ parameters.setPreviewSize(320, 240); Log.i(TAG, "pic pingmu fenbianlv"); /* 設(shè)置圖片分辨率大小 */ parameters.setPictureSize(1024, 768); Log.i(TAG, "pic tupian fenbianlv"); /* 將Camera.Parameters設(shè)置予Camera */ mCamera01.setParameters(parameters); /* setPreviewDisplay唯一的參數(shù)為SurfaceHolder */ mCamera01.setPreviewDisplay(mSurfaceHolder01); /* 立即運行Preview */ mCamera01.startPreview();
初始化成功后就可以進(jìn)行拍照了,拍照函數(shù)依然是通過調(diào)用camera類的函數(shù)來實現(xiàn)
只需實現(xiàn)jpegCallback這個回調(diào)函數(shù)來就行解碼、保存即可,前2個參數(shù)可以直接設(shè)為null,不過系統(tǒng)一般會自動幫你把這些都寫進(jìn)來的
private PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { // TODO Handle JPEG image data /* onPictureTaken傳入的第一個參數(shù)即為相片的byte */ Bitmap bm = BitmapFactory.decodeByteArray (_data, 0, _data.length); /* 創(chuàng)建新文件 */ picname = "sdcard/1234566.jpg";//要保存在哪里,路徑你自己設(shè) File myCaptureFile = new File(picname); try { BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream(myCaptureFile)); /* 采用壓縮轉(zhuǎn)檔方法 */ bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); /* 調(diào)用flush()方法,更新BufferStream */ bos.flush(); /* 結(jié)束OutputStream */ bos.close(); /* 將拍照下來且存儲完畢的圖文件,顯示出來 */ //mImageView01.setImageBitmap(bm); /* 顯示完圖文件,立即重置相機(jī),并關(guān)閉預(yù)覽 */ resetCamera(); } catch (Exception e) { Log.e(TAG, e.getMessage()); } } };
拍照完了要重置照相機(jī),然后可以繼續(xù)拍照
/* 相機(jī)重置 */ private void resetCamera() { if (mCamera01 != null && bIfPreview) { mCamera01.stopPreview(); /* 擴(kuò)展學(xué)習(xí),釋放Camera對象 */ mCamera01.release(); mCamera01 = null; bIfPreview = false; } }
2種拍照方式的比較
①. 調(diào)用系統(tǒng)自帶的照相機(jī),照片格式大小只有幾種選擇,照片拍出來比較大,而自己程序?qū)崿F(xiàn)的話可以調(diào)節(jié)照片大小為任意尺寸,圖片的容量可以調(diào)節(jié)
②. 調(diào)用系統(tǒng)的簡單,而且外觀一般比自己設(shè)置的要好看
③. 調(diào)用系統(tǒng)的操作簡單、方便,不易出錯,自己編程的話需要注意,容易引起系統(tǒng)出錯意外終止
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結(jié)》、《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android對話框AlertDialog與DatePickerDialog及TimePickerDialog使用詳解
這篇文章主要介紹了Android對話框中的提醒對話框AlertDialog、日期對話框DatePickerDialog、時間對話框TimePickerDialog使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09Android學(xué)習(xí)之AppWidget高級效果
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之AppWidget高級效果的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-08-08Android中Activity跳轉(zhuǎn)的創(chuàng)建步驟總結(jié)
這篇文章主要介紹了Android中Activity跳轉(zhuǎn)的創(chuàng)建步驟總結(jié),本文詳細(xì)的講解了從工程創(chuàng)建到跳轉(zhuǎn)Activity的實現(xiàn)完整過程,需要的朋友可以參考下2014-10-10使用ViewPager實現(xiàn)左右循環(huán)滑動及滑動跳轉(zhuǎn)
今天實現(xiàn)了左右滑動,至于在最后一頁滑動跳轉(zhuǎn),這個也做了但是效果不是太好,也希望有實現(xiàn)的朋友能夠分享下2013-01-01android 修改launcher行數(shù)和列數(shù)的方法
這篇文章主要介紹了android 修改launcher行數(shù)和列數(shù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07Android中使用Toast.cancel()方法優(yōu)化toast內(nèi)容顯示的解決方法
做程序員的,基本一看api就知道,用這個可以取消上一個toast的顯示,然后顯示下一個,這樣就能解決出現(xiàn)的問題。可是在測試的過程中,發(fā)現(xiàn)卻沒有想象中的那么簡單,不信可以百度一下,很多很多人發(fā)現(xiàn)toast的cancel()方法不起作用2013-05-05Android Studio報錯Manifest merger failed with multiple errors
這篇文章主要介紹了Android Studio報錯Manifest merger failed with multiple errors2017-10-10Android之IphoneTreeView帶組指示器的ExpandableListView效果
在正在顯示的最上面的組的標(biāo)簽位置添加一個和組視圖完全一樣的視圖,作為組標(biāo)簽。這個標(biāo)簽的位置要隨著列表的滑動不斷變化,以保持總是顯示在最上方,并且該消失的時候就消失2013-06-06