android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览
在使用android設備的攝像頭的時候我們有兩種選擇:
1.調用intent方法使用攝像頭
2.通過camera類使用攝像頭
第一種方法非常方便,不過需要跳到新的activity中,這樣的用戶體驗并不是特別好
使用camera能有更大的自定義空間!
使用camera就需要用surfaceview顯示攝像頭的即時畫面
我們這樣設置layout:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context="com.example.video_activity.MainActivity" >
android:id="@+id/surfaceview"
android:layout_width="320dp"
android:layout_height="240dp" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
android:id="@+id/change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="change" />
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="which camera" />
一個靜態的surfaceview、Button和Textview
button是用于后面切換攝像頭的
textview用于顯示攝像頭id
實例化以上控件再聲明一個camera對象。
private Camera mCamera;
實例化控件后還要給surfaceview一個holder用于接收camera的內容。
一個layoutParameters用于改變surfaceview尺寸(否則會產生畸變)
lp = surfaceView.getLayoutParams();
sh = surfaceView.getHolder();
選一個攝像頭的id(默認可以為0或者1),獲取它的信息
private Void OpenCameraAndSetSurfaceviewSize(int cameraId) {
mCamera = Camera.open(cameraId);//id用于選中不同的攝像頭,有的相機會有很多的
Camera.Parameters parameters = mCamera.getParameters();
Size pre_size = parameters.getPreviewSize();
Size pic_size = parameters.getPictureSize();//和預覽的尺寸不同,這是拍照后實際相片的尺寸,會比較大
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);//獲取選中的攝像頭信息
int camera_number = Camera.getNumberOfCameras();//獲取攝像頭數量
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {//分辨是否前置攝像頭
textview.setText("There are " + camera_number + " camera."
+ "This is the Front Camera!");
} else {
textview.setText("There are " + camera_number + " camera."
+ "This is the Back Camera!");
}
lp.height = pre_size.width * 2;
lp.width = pre_size.height * 2;
return null;
}
我們編寫SetAndStartPreview方法實例化camera并將預覽加載到surfaceview中
private Void SetAndStartPreview(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
切換攝像頭的原理就將camera釋放掉再重新加載。 為button添加事件監聽:
change_Button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mCamera.stopPreview();
mCamera.release();
if (cameraId == 0) {
cameraId = 1;
} else {
cameraId = 0;
}
OpenCameraAndSetSurfaceviewSize(cameraId);
// the surfaceview is ready after the first launch
SetAndStartPreview(sh);
}
});
值得一提的是我們將camera和surface holder關聯的時候必須確保surfaceview已經建立好,否則camera獲取不到surfaceview的信息
我們需要為surfaceholder添加addCallback(this);并在create中調用方法
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
SetAndStartPreview(holder);
}
源碼在這里??
http://download.csdn.net/detail/edwardwayne/8491597
總結
以上是生活随笔為你收集整理的android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android ios web兼容,js
- 下一篇: webrtc回声消除线程android,