成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

創(chuàng)新互聯(lián)是一家專業(yè)提供洛南企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為洛南眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

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)鍵是這里:

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

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

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

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

網(wǎng)站名稱:Android編程實現(xiàn)拍照功能的2種方法分析
轉(zhuǎn)載來于:http://jinyejixie.com/article38/jjposp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、面包屑導(dǎo)航品牌網(wǎng)站設(shè)計、云服務(wù)器、動態(tài)網(wǎng)站服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
项城市| 和硕县| 靖边县| 永州市| 枝江市| 扶余县| 噶尔县| 澎湖县| 汶上县| 公主岭市| 通城县| 阜新| 沅陵县| 基隆市| 敦化市| 龙岩市| 新乡市| 禹州市| 桂林市| 高碑店市| 苏尼特左旗| 安西县| 抚顺市| 弋阳县| 灵丘县| 卢氏县| 泉州市| 区。| 潮安县| 墨脱县| 内乡县| 天水市| 临清市| 巴楚县| 时尚| 枣阳市| 堆龙德庆县| 宜良县| 开远市| 齐齐哈尔市| 天祝|