中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Android編程實現拍照功能的2種方法分析

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

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

Android系統的照相功能,已實現2種方法,可供大家參考:

1. 調用系統攝像頭來拍照

首先,找到AndroidManifest.xml文件里加入用戶權限

<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),是用來觸發按鈕事件和顯示圖片的,純是個人愛好

final int TAKE_PICTURE = 1;
//為了表示返回方法中辨識你的程序打開的相機

關鍵是這里:

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

是打開系統自帶相機,以下是處理拍照得到的數據,將數據保存下來

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));
      /* 采用壓縮轉檔方法 */
       bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
       /* 調用flush()方法,更新BufferStream */
       bos.flush();
       /* 結束OutputStream */
       bos.close();
     } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
   }
  }
}

這樣就能實現調用系統自帶的攝像頭了,很簡單的操作。

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是用來進行預覽的,
在Oncreat函數里初始化一系列的值:

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必須實現SurfaceHolder.Callback */
mSurfaceHolder01.addCallback(takephoto.this);
/*
* 以SURFACE_TYPE_PUSH_BUFFERS(3)
* 作為SurfaceHolder顯示類型
* */
mSurfaceHolder01.setType
(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

首先進行初始化照相機的功能函數和參數設置:

private Camera mCamera01;
mCamera01 = Camera.open();
/* 創建Camera.Parameters對象 */
Camera.Parameters parameters = mCamera01.getParameters();
/* 設置相片格式為JPEG */
parameters.setPictureFormat(PixelFormat.JPEG);
Log.i(TAG, "pic is jpeg");
/* 指定preview的屏幕大小 */
parameters.setPreviewSize(320, 240);
Log.i(TAG, "pic pingmu fenbianlv");
/* 設置圖片分辨率大小 */
parameters.setPictureSize(1024, 768);
Log.i(TAG, "pic tupian fenbianlv");
/* 將Camera.Parameters設置予Camera */
mCamera01.setParameters(parameters);
/* setPreviewDisplay唯一的參數為SurfaceHolder */
mCamera01.setPreviewDisplay(mSurfaceHolder01);
/* 立即運行Preview */
mCamera01.startPreview();

初始化成功后就可以進行拍照了,拍照函數依然是通過調用camera類的函數來實現

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

只需實現jpegCallback這個回調函數來就行解碼、保存即可,前2個參數可以直接設為null,不過系統一般會自動幫你把這些都寫進來的

private PictureCallback jpegCallback = new PictureCallback()
{
   public void onPictureTaken(byte[] _data, Camera _camera)
   {
    // TODO Handle JPEG image data
    /* onPictureTaken傳入的第一個參數即為相片的byte */
    Bitmap bm = BitmapFactory.decodeByteArray
          (_data, 0, _data.length);
    /* 創建新文件 */
       picname = "sdcard/1234566.jpg";//要保存在哪里,路徑你自己設
    File myCaptureFile = new File(picname);
    try
    {
     BufferedOutputStream bos = new BufferedOutputStream
     (new FileOutputStream(myCaptureFile));
     /* 采用壓縮轉檔方法 */
     bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
     /* 調用flush()方法,更新BufferStream */
     bos.flush();
     /* 結束OutputStream */
     bos.close();
     /* 將拍照下來且存儲完畢的圖文件,顯示出來 */
     //mImageView01.setImageBitmap(bm);
     /* 顯示完圖文件,立即重置相機,并關閉預覽 */
     resetCamera();
     }
    catch (Exception e)
    {
     Log.e(TAG, e.getMessage());
    }
   }
};

拍照完了要重置照相機,然后可以繼續拍照

/* 相機重置 */
private void resetCamera()
{
   if (mCamera01 != null && bIfPreview)
   {
    mCamera01.stopPreview();
    /* 擴展學習,釋放Camera對象 */
    mCamera01.release();
    mCamera01 = null;
    bIfPreview = false;
   }
}

2種拍照方式的比較

①. 調用系統自帶的照相機,照片格式大小只有幾種選擇,照片拍出來比較大,而自己程序實現的話可以調節照片大小為任意尺寸,圖片的容量可以調節

②. 調用系統的簡單,而且外觀一般比自己設置的要好看

③. 調用系統的操作簡單、方便,不易出錯,自己編程的話需要注意,容易引起系統出錯意外終止

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結》、《Android圖形與圖像處理技巧總結》、《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》

希望本文所述對大家Android程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲沃县| 铜梁县| 湟源县| 英德市| 克拉玛依市| 新郑市| 北流市| 琼海市| 新泰市| 辰溪县| 邹平县| 新巴尔虎右旗| 武冈市| 盐边县| 福泉市| 宁海县| 道孚县| 苍梧县| 奈曼旗| 大理市| 齐河县| 璧山县| 丰镇市| 雷州市| 开阳县| 深水埗区| 成武县| 佛坪县| 西宁市| 平泉县| 乌拉特前旗| 鹤庆县| 尖扎县| SHOW| 镇坪县| 景东| 中西区| 峨山| 彰化县| 托克逊县| 屯门区|