溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android編程實(shí)現(xiàn)拍照功能的2種方法分析

發(fā)布時間:2020-10-06 20:42:28 來源:腳本之家 閱讀:154 作者:napolun007 欄目:移動開發(fā)

本文實(shí)例講述了Android編程實(shí)現(xiàn)拍照功能的2種方法。分享給大家供大家參考,具體如下:

Android系統(tǒng)的照相功能,已實(shí)現(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)鍵是這里:

復(fù)制代碼 代碼如下:
startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);

是打開系統(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();
     }
   }
  }
}

這樣就能實(shí)現(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必須實(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對象 */
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ù)依然是通過調(diào)用camera類的函數(shù)來實(shí)現(xiàn)

復(fù)制代碼 代碼如下:
mCamera01.takePicture(shutterCallback, rawCallback, jpegCallback);

只需實(shí)現(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è)計有所幫助。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI