Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 基於android的遠程視頻監控系統——實現Camera預覽

基於android的遠程視頻監控系統——實現Camera預覽

編輯:關於android開發

如標題所述,學習如何打開攝像頭,並在屏幕上預覽圖像。使用Camera的步驟:
(1)調用Camera的open()方法打開相機;
(2)調用Camera的getParameters()方法獲取拍照參數,該方法返回一個Camera.Parameters對象;
(3)調用Camera的setParameters()方法//android2.3.3以後無需此步;
(4)調用Camera的startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設置使用哪個surfaceview來顯示取景圖片;
(5)結束程序時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源。
以上過程參考《瘋狂android講義》,這本書確實不錯,能夠快速入門。整個系統大部分框架是參考此書的,部分問題在網上搜的資料。

1.在AndroidManifest.xml文件中添加camera的權限

<!-- 授予程序使用攝像頭的權限 -->

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

<uses-feature android:name="android.hardware.camera" />

<uses-feature android:name="android.hardware.camera.autofocus" />

2.在界面布局文件中添加一個surfaceview用於顯示預覽圖片

<SurfaceView

android:id="@+id/sView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

/>

3.程序主體
在這裡我們定義了一個SurfaceView變量sView用於獲取布局文件中定義的SurfaceView組件。關於SurfaceView的基本問題,這個講的蠻好的。

我們在SurfaceView被創建時調用initcamera()初始化攝像頭,在SurfaceView被銷毀時釋放攝像頭。而這兩個時間是通過surfaceHolder.addCallback得到的,看看下面代碼就明白了。

public class MainActivity extends Activity {

 

SurfaceView sView;

SurfaceHolder surfaceHolder;

int screenWidth, screenHeight;

// 定義系統所用的照相機

Camera camera;

//是否在浏覽中

boolean isPreview = false;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

// 設置全屏

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_main);

WindowManager wm = (WindowManager) getSystemService(

Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

// 獲取屏幕的寬和高

screenWidth = display.getWidth();

screenHeight = display.getHeight();

// 獲取界面中SurfaceView組件

sView = (SurfaceView) findViewById(R.id.sView);

// 獲得SurfaceView的SurfaceHolder

surfaceHolder = sView.getHolder();

// 為surfaceHolder添加一個回調監聽器

surfaceHolder.addCallback(new Callback()

{

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height)

{

}

@Override

public void surfaceCreated(SurfaceHolder holder)

{

// 打開攝像頭

initCamera();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder)

{

// 如果camera不為null ,釋放攝像頭

if (camera != null)

{

if (isPreview)

camera.stopPreview();

camera.release();

camera = null;

}

}

});

// 設置該SurfaceView自己不維護緩沖

surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

 

private void initCamera()

{

if (!isPreview)

{

camera = Camera.open();

}

if (camera != null && !isPreview)

{

try

{

Camera.Parameters parameters = camera.getParameters();

// 設置預覽照片的大小

parameters.setPreviewSize(screenWidth, screenHeight);

// 每秒顯示4幀

parameters.setPreviewFrameRate(4);

// 設置圖片格式

parameters.setPictureFormat(PixelFormat.JPEG);

// 設置JPG照片的質量

parameters.set("jpeg-quality", 85);

//設置照片的大小

parameters.setPictureSize(screenWidth, screenHeight);

//android2.3.3以後無需下步

//camera.setParameters(parameters);

//通過SurfaceView顯示取景畫面

camera.setPreviewDisplay(surfaceHolder);

// 開始預覽

camera.startPreview();

// 自動對焦

camera.autoFocus(null);

}

catch (Exception e)

{

e.printStackTrace();

}

isPreview = true;

}

}

}

  就這樣你就可以使用攝像頭預覽了。當然你會發現預覽的圖像轉了90度,方向不對。我們在AndroidManifest.xml文件的activity屬性設置中添加

 

android:screenOrientation="landscape"

  設置成橫屏就OK了。如果黑屏請檢查camera.setParameters(parameters);這步是否與自己系統匹配,2.3.3以後是不須此步的。
就這樣簡單,我們就完成了無線視頻監控的第一步,實現了攝像頭圖像的預覽。在這裡我們設置了預覽但是卻沒有對每幀圖像數據進行處理,下次將講如何獲得攝像頭的每一幀圖像以及如何處理。

下面是sdk2.3.3下的源碼,在我android4.04系統的手機上也能運行。由於android開發工具的升級,這個源碼包跟以前版本有所不同,不知道和舊版本是否有沖突。如過不行大家新建個工程,再把3個關鍵文件的內容復制過去應該沒問題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved