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" />

其次,在主類java文件里加入2個(gè)控件(button和imageview),是用來(lái)觸發(fā)按鈕事件和顯示圖片的,純是個(gè)人愛好
final int TAKE_PICTURE = 1;//為了表示返回方法中辨識(shí)你的程序打開的相機(jī)
關(guān)鍵是這里:
startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);
是打開系統(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.自己寫程序來(lái)保存照片

照片格局文件lay.xml里要先進(jìn)行這些定義

<?xml version="1.0" encoding="utf-8"?><LinearLayout  xmlns:android="[http://schemas.android.com/apk/res/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顯示類型       * */     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類的函數(shù)來(lái)實(shí)現(xiàn)
mCamera01.takePicture       (shutterCallback, rawCallback, jpegCallback);

只需實(shí)現(xiàn)jpegCallback這個(gè)回調(diào)函數(shù)來(lái)就行解碼、保存即可,前2個(gè)參數(shù)可以直接設(shè)為null,不過(guò)系統(tǒng)一般會(huì)自動(dòng)幫你把這些都寫進(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 種拍照方式的比較

1.調(diào)用系統(tǒng)自帶的照相機(jī),照片格式大小只有幾種選擇,照片拍出來(lái)比較大,而自己程序?qū)崿F(xiàn)的話可以調(diào)節(jié)照片大小為任意尺寸,圖片的容量可以調(diào)節(jié)
2.調(diào)用系統(tǒng)的簡(jiǎn)單,而且外觀一般比自己設(shè)置的要好看
3.調(diào)用系統(tǒng)的操作簡(jiǎn)單、方便,不易出錯(cuò),自己編程的話需要注意,容易引起系統(tǒng)出錯(cuò)意外終止

轉(zhuǎn)接:http://blog.csdn.net/napolun007/article/details/6103307

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,023評(píng)論 25 709
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,328評(píng)論 0 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,268評(píng)論 4 61
  • 我純真可愛的孩子們,不久你們就要告別生活了六年的校園了。即便今天看上去你們真的好像沒有什么感覺:你們依然按部就班地...
    雪落詩(shī)肩閱讀 706評(píng)論 0 0
  • 在過(guò)去的一天里,我見過(guò)的最能應(yīng)景的語(yǔ)言就是這句“在過(guò)去的一天里在社交網(wǎng)絡(luò)上,論壇上,還有就是各個(gè)自媒體的轉(zhuǎn)發(fā)中會(huì)涌...
    佩服佩服閱讀 338評(píng)論 0 0

友情鏈接更多精彩內(nèi)容