【android學習之十五】——多媒體2:相機Camera

來源:互聯網
上載者:User
  二、多媒體之相機Camera

        手機的相機功能是當前大家玩拍照的一個必備功能,本篇的學習,我認為網上的一篇博文的講解更容易理解一下,這裡就轉一下博文,自己把自己遇到的的問題給補充進來。引用的博文地址:http://xblia.iteye.com/blog/1167964

        目前的智能手機擁有很多強大的功能,例如網路攝影機、GPS和無線上網等,現在是我們開始充分使用這些功能的時候了,在本篇文章中我們一起學習,如何在GoogleAndroid編程環境中,以最簡單的方式實現GoogleAndroid網路攝影機拍照。

  在本文樣本中,我們需要用到兩個檔案:布局檔案和Activity檔案。

【提示】:在Android 1.5(代號cupcake)發布之後,在安全方面有諸多改進,其中之一與網路攝影機許可權控制有關。在此之前,你能夠建立無需使用者許可就可實現拍照的應用。現在該問題已被修複,如果你想在自己的應用中使用網路攝影機,需要在AndroidManifest.xml中增加以下代碼:

<uses-permission android:name="android.permission.CAMERA"/>

沒有此授權碼,程式會報:Fail to connect to camera service 錯誤。

  1.  設定網路攝影機布局

  這是開發工作的基礎,也就是說我們希望在應用程式中增加多少輔助性元素,如網路攝影機各種功能按鈕等。在本文中我們採取最簡方式,除了拍照外,沒有多餘網路攝影機功能。下面我們一起看一下本文樣本將要用到的布局檔案“main.xml”。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <SurfaceView        android:id="@+id/surface_camera"        android:layout_width="fill_parent"        android:layout_height="10dip"        android:layout_weight="1" >    </SurfaceView></LinearLayout>

該布局非常簡單,只有一個LinearLayout視圖組,在它下面只有一個SurfaceView視圖,也就是我們的網路攝影機螢幕。

【提示】:記住不要在資源檔名稱中使用大寫字母,如果你把該檔案命名為“CameraSurface.xml”,會給你帶來不必要的麻煩。

2.  網路攝影機實現CameraActivity代碼

package com.jercy.android.Camera;import java.io.IOException;import android.app.Activity;import android.graphics.PixelFormat;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;import android.view.WindowManager;public class CameraActivity extends Activity implements SurfaceHolder.Callback   {private static final String TAG="CameraActivity";private Camera mCamera;private SurfaceView mSurfaceView;private SurfaceHolder mSurfaceHolder;private boolean mPreviewRunning = false;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getWindow().setFormat(PixelFormat.TRANSLUCENT); //螢幕格式為“半透明”。          requestWindowFeature(Window.FEATURE_NO_TITLE);  //網路攝影機預覽介面將通過全螢幕顯示,沒有“標題(title)”        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);                setContentView(R.layout.main);   //設定Activity的布局為前面我們建立的main布局        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);                   mSurfaceHolder = mSurfaceView.getHolder();   //surfaceview中獲得了holder        mSurfaceHolder.addCallback(this);   //並增加callback功能到“this”。這意味著我們的操作(activity)將可以管理這個surfaceview。        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    }    @Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i(TAG, "調用了CameraActivity的surfaceCreated方法");//mCamera是“Camera”類的一個對象。在surfaceCreated方法中我們“開啟”網路攝影機。這就是啟動它的方式 mCamera = Camera.open();  }@Override/** * 該方法讓網路攝影機做好拍照準備,設定它的參數,並開始在Android螢幕中啟動預覽畫面。 * 當mPreviewRunning為true時,意味著網路攝影機處於啟用狀態,並未被關閉,因此我們可以使用它。 */public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stubLog.i(TAG, "調用了CameraActivity的surfaceChanged方法");if(mPreviewRunning) {   mCamera.stopPreview();   }   Camera.Parameters p = mCamera.getParameters();   p.setPreviewSize(width, height);   mCamera.setParameters(p);   try {   mCamera.setPreviewDisplay(holder);   } catch (IOException e) {   e.printStackTrace();   }   mCamera.startPreview();   mPreviewRunning = true;}@Override/** * 通過這個方法,我們停止網路攝影機,並釋放相關的資源。正如大家所看到的,我們在這兒設定mPreviewRunning為false, * 以此來防止在surfaceChanged方法中的衝突。因為這意味著我們已經關閉了網路攝影機,而且我們不能再設定其參數或在網路攝影機中啟動映像預覽 */public void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i(TAG, "調用了CameraActivity的surfaceDestroyed方法");mCamera.stopPreview();   mPreviewRunning = false;   mCamera.release();   }/** * 當拍照時,該方法被調用。舉例來說,你可以在介面上建立一個OnClickListener,當你點擊螢幕時, * 調用PictureCallBack方法。 這個方法會向你提供映像的位元組數組, * 然後你可以使用Android提供的Bitmap和BitmapFactory類,將其從位元組數群組轉換成你想要的映像格式。 */Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {   public void onPictureTaken(byte[] imageData, Camera c) {   }   };  }

分析Activity類,實現SurfaceHolder.Callback介面:

介面SurfaceHolder.Callback被用來接收網路攝影機預覽介面變化的資訊。它實現了三個方法:

  surfaceChanged

  當預覽介面的格式和大小發生改變時,該方法被調用。

  surfaceCreated

  初次執行個體化,預覽介面被建立時,該方法被調用。

  surfaceDestroyed

  當預覽介面被關閉時,該方法被調用。

 

如為運行程式,並且點擊取消按鈕退出程式過程的Log日誌:

11-14 08:24:10.420: I/CameraActivity(426): 調用了CameraActivity的surfaceCreated方法11-14 08:24:20.374: I/CameraActivity(426): 調用了CameraActivity的surfaceChanged方法11-14 08:24:32.899: W/KeyCharacterMap(426): No keyboard for id 011-14 08:24:32.899: W/KeyCharacterMap(426): Using default keymap: /system/usr/keychars/qwerty.kcm.bin11-14 08:24:35.746: I/CameraActivity(426): 調用了CameraActivity的surfaceDestroyed方法

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.