Android編程實(shí)現(xiàn)拍照功能的2種方法分析
本文實(shí)例講述了Android編程實(shí)現(xiàn)拍照功能的2種方法。分享給大家供大家參考,具體如下:
Android系統(tǒng)的照相功能,已實(shí)現(xiàn)2種方法,可供大家參考:
1. 調(diào)用系統(tǒng)攝像頭來(lái)拍照
首先,找到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" />
其次,在主類(lèi)Java文件里加入2個(gè)控件(button和imageview),是用來(lái)觸發(fā)按鈕事件和顯示圖片的,純是個(gè)人愛(ài)好
final int TAKE_PICTURE = 1; //為了表示返回方法中辨識(shí)你的程序打開(kāi)的相機(jī)
關(guān)鍵是這里:
是打開(kāi)系統(tǒng)自帶相機(jī),以下是處理拍照得到的數(shù)據(jù),將數(shù)據(jù)保存下來(lái)
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();
}
}
}
}
這樣就能實(shí)現(xiàn)調(diào)用系統(tǒng)自帶的攝像頭了,很簡(jiǎn)單的操作。
2. 自己寫(xiě)程序來(lái)保存照片
照片格局文件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是用來(lái)進(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對(duì)象 */ mSurfaceHolder01 = mSurfaceView01.getHolder(); /* Activity必須實(shí)現(xiàn)SurfaceHolder.Callback */ mSurfaceHolder01.addCallback(takephoto.this); /* * 以SURFACE_TYPE_PUSH_BUFFERS(3) * 作為SurfaceHolder顯示類(lèi)型 * */ mSurfaceHolder01.setType (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
首先進(jìn)行初始化照相機(jī)的功能函數(shù)和參數(shù)設(shè)置:
private Camera mCamera01; mCamera01 = Camera.open(); /* 創(chuàng)建Camera.Parameters對(duì)象 */ 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); /* 立即運(yùn)行Preview */ mCamera01.startPreview();
初始化成功后就可以進(jìn)行拍照了,拍照函數(shù)依然是通過(guò)調(diào)用camera類(lèi)的函數(shù)來(lái)實(shí)現(xiàn)
只需實(shí)現(xiàn)jpegCallback這個(gè)回調(diào)函數(shù)來(lái)就行解碼、保存即可,前2個(gè)參數(shù)可以直接設(shè)為null,不過(guò)系統(tǒng)一般會(huì)自動(dòng)幫你把這些都寫(xiě)進(jìn)來(lái)的
private PictureCallback jpegCallback = new PictureCallback()
{
public void onPictureTaken(byte[] _data, Camera _camera)
{
// TODO Handle JPEG image data
/* onPictureTaken傳入的第一個(gè)參數(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();
/* 將拍照下來(lái)且存儲(chǔ)完畢的圖文件,顯示出來(lái) */
//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對(duì)象 */
mCamera01.release();
mCamera01 = null;
bIfPreview = false;
}
}
2種拍照方式的比較
①. 調(diào)用系統(tǒng)自帶的照相機(jī),照片格式大小只有幾種選擇,照片拍出來(lái)比較大,而自己程序?qū)崿F(xiàn)的話可以調(diào)節(jié)照片大小為任意尺寸,圖片的容量可以調(diào)節(jié)
②. 調(diào)用系統(tǒng)的簡(jiǎn)單,而且外觀一般比自己設(shè)置的要好看
③. 調(diào)用系統(tǒng)的操作簡(jiǎn)單、方便,不易出錯(cuò),自己編程的話需要注意,容易引起系統(tǒng)出錯(cuò)意外終止
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結(jié)》、《Android圖形與圖像處理技巧總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Kotlin結(jié)合Rxjava+Retrofit實(shí)現(xiàn)極簡(jiǎn)網(wǎng)絡(luò)請(qǐng)求的方法
這篇文章主要給大家介紹了關(guān)于Kotlin結(jié)合Rxjava+Retrofit實(shí)現(xiàn)極簡(jiǎn)網(wǎng)絡(luò)請(qǐng)求的相關(guān)內(nèi)容,文中分別對(duì)Rxjava和Retrofit進(jìn)行了簡(jiǎn)單的介紹,然后通過(guò)示例代碼詳細(xì)介紹了如何實(shí)現(xiàn)極簡(jiǎn)網(wǎng)絡(luò)請(qǐng)求,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11
Android屏幕旋轉(zhuǎn) 處理Activity與AsyncTask的最佳解決方案
運(yùn)行時(shí)變更就是設(shè)備在運(yùn)行時(shí)發(fā)生變化(例如屏幕旋轉(zhuǎn)、鍵盤(pán)可用性及語(yǔ)言)。發(fā)生這些變化,Android會(huì)重啟Activity,這時(shí)就需要保存activity的狀態(tài)及與activity相關(guān)的任務(wù),以便恢復(fù)activity的狀態(tài)。為此,google提供了三種解決方案,本文將對(duì)這三種方案進(jìn)行逐一介紹。2016-12-12
Android 通過(guò)當(dāng)前經(jīng)緯度獲得城市的實(shí)例代碼
Android 通過(guò)當(dāng)前經(jīng)緯度獲得城市的實(shí)例代碼,需要的朋友可以參考一下2013-06-06
Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
android打開(kāi)應(yīng)用所在的市場(chǎng)頁(yè)面進(jìn)行評(píng)分操作的方法
這篇文章主要介紹了android打開(kāi)應(yīng)用所在的市場(chǎng)頁(yè)面進(jìn)行評(píng)分操作的方法,涉及Android操作市場(chǎng)頁(yè)面評(píng)分效果的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
Android自定義View實(shí)現(xiàn)旋轉(zhuǎn)的圓形圖片
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)旋轉(zhuǎn)的圓形圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
詳解Android首選項(xiàng)框架的使用實(shí)例
首選項(xiàng)這個(gè)名詞對(duì)于熟悉Android的朋友們一定不會(huì)感到陌生,它經(jīng)常用來(lái)設(shè)置軟件的運(yùn)行參數(shù)。本篇文章主要介紹詳解Android首選項(xiàng)框架的使用實(shí)例,有興趣的可以了解一下。2016-11-11

