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; //為了表示返回方法中辨識你的程序打開的相機
關(guān)鍵是這里:
是打開系統(tǒng)自帶相機,以下是處理拍照得到的數(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里要先進行這些定義
<?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是用來進行預(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作為相機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);
首先進行初始化照相機的功能函數(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();
初始化成功后就可以進行拍照了,拍照函數(shù)依然是通過調(diào)用camera類的函數(shù)來實現(xiàn)
只需實現(xiàn)jpegCallback這個回調(diào)函數(shù)來就行解碼、保存即可,前2個參數(shù)可以直接設(shè)為null,不過系統(tǒng)一般會自動幫你把這些都寫進來的
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);
/* 顯示完圖文件,立即重置相機,并關(guān)閉預(yù)覽 */
resetCamera();
}
catch (Exception e)
{
Log.e(TAG, e.getMessage());
}
}
};
拍照完了要重置照相機,然后可以繼續(xù)拍照
/* 相機重置 */
private void resetCamera()
{
if (mCamera01 != null && bIfPreview)
{
mCamera01.stopPreview();
/* 擴展學(xué)習(xí),釋放Camera對象 */
mCamera01.release();
mCamera01 = null;
bIfPreview = false;
}
}
2種拍照方式的比較
①. 調(diào)用系統(tǒng)自帶的照相機,照片格式大小只有幾種選擇,照片拍出來比較大,而自己程序?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ā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Kotlin結(jié)合Rxjava+Retrofit實現(xiàn)極簡網(wǎng)絡(luò)請求的方法
這篇文章主要給大家介紹了關(guān)于Kotlin結(jié)合Rxjava+Retrofit實現(xiàn)極簡網(wǎng)絡(luò)請求的相關(guān)內(nèi)容,文中分別對Rxjava和Retrofit進行了簡單的介紹,然后通過示例代碼詳細(xì)介紹了如何實現(xiàn)極簡網(wǎng)絡(luò)請求,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
Android屏幕旋轉(zhuǎn) 處理Activity與AsyncTask的最佳解決方案
運行時變更就是設(shè)備在運行時發(fā)生變化(例如屏幕旋轉(zhuǎn)、鍵盤可用性及語言)。發(fā)生這些變化,Android會重啟Activity,這時就需要保存activity的狀態(tài)及與activity相關(guān)的任務(wù),以便恢復(fù)activity的狀態(tài)。為此,google提供了三種解決方案,本文將對這三種方案進行逐一介紹。2016-12-12
Android 通過當(dāng)前經(jīng)緯度獲得城市的實例代碼
Android 通過當(dāng)前經(jīng)緯度獲得城市的實例代碼,需要的朋友可以參考一下2013-06-06
Android RecyclerView實現(xiàn)下拉刷新和上拉加載更多
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實現(xiàn)下拉刷新和上拉加載更多,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
android打開應(yīng)用所在的市場頁面進行評分操作的方法
這篇文章主要介紹了android打開應(yīng)用所在的市場頁面進行評分操作的方法,涉及Android操作市場頁面評分效果的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
Android自定義View實現(xiàn)旋轉(zhuǎn)的圓形圖片
這篇文章主要為大家詳細(xì)介紹了Android自定義View實現(xiàn)旋轉(zhuǎn)的圓形圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01

