实现android 前后摄像头切换效果

近期公司要搞摄像头测试,就专心在网上找资料,可是网上的资料很多都是只有一些简单的介绍,今天我就整理好,希望可以帮助一下有需要的朋友!!


1、首先的在清单AndroidManifest.xml中添加一下权限:


  

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


2、贴出代码

package com.camera.ui;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;


public class CameraActivity extends Activity {


private SurfaceView mSurfaceView;
private SurfaceHolder mHolder;
private Camera mCamera;
Boolean mBoolean=false;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
initSurface();        


new Thread(new Runnable() {
@Override
public void run() {
initCamera();
}
}).start();


}




private void initSurface(){
mSurfaceView = (SurfaceView) findViewById(R.id.camera_surfaceview);
mHolder = mSurfaceView.getHolder();
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}


private void initCamera() {
if(checkCameraHardware(getApplicationContext())){
openFacingCamera();
autoFocus();
}
}
private void autoFocus() {
try {
//Because open camera takes time, let the thread to sleep here
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mCamera.autoFocus(mAutoFocus);
mCamera.takePicture(null, null, mPicCallback);
}


private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
return true;
} else {
return false;
}    
}


private  Boolean  openFacingCamera() {
//Open a front-facing camera
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
if(!mBoolean){
for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
mCamera = Camera.open(camIdx);
mBoolean =true;
}
} 
}


else if(mBoolean){
//Open the rear camera
for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
try {   
mCamera = Camera.open(camIdx);
mBoolean =false;
} catch (RuntimeException e) {
e.printStackTrace();
return false;
}
}
}
}
try {     
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
e.printStackTrace();
mCamera.stopPreview();
mCamera.release();
mCamera = null;
return false;
} 
mCamera.startPreview();
return true;
}


private AutoFocusCallback mAutoFocus = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
}
};


private PictureCallback mPicCallback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//Will get 270 photos of rotation, so that it is vertical
Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix mMatrix = new Matrix();
mMatrix.preRotate(270);
mBitmap = Bitmap.createBitmap(mBitmap ,0,0, mBitmap .getWidth(), mBitmap .getHeight(),mMatrix,true);
File mFile = new File(getDir(), "CameraTest.jpg");
try {
FileOutputStream mFileOutputStream = new FileOutputStream(mFile);
mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mFileOutputStream);
mFileOutputStream.close();
} catch (Exception error) {
Toast.makeText(CameraActivity.this, "Pictures failed", Toast.LENGTH_SHORT).show();;
error.printStackTrace();
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
Toast.makeText(CameraActivity.this, "To get photos success", Toast.LENGTH_SHORT).show();;
mCamera.stopPreview();
mCamera.release();
mCamera = null;
initCamera();
}
};
private File getDir(){
File mDir = Environment.getExternalStorageDirectory();
if (mDir.exists()) {
return mDir;
} else {
mDir.mkdirs();
return mDir;
}
}
}


3、还有就是简单的main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyCamera" >
    <SurfaceView
        android:id="@+id/camera_surfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </SurfaceView>
</RelativeLayout>



4、参考了一些厉害的博客,自己也在学习积累。

例如:http://blog.csdn.net/bill_ming/article/details/7730305


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android上,切换外部摄像头可以通过以下几种方式实现: 1. 使用Camera API: 在Android中,可以使用Camera API访问外部摄像头。首先,你需要获取外部摄像头的信息,可以使用Camera类的getNumberOfCameras()方法获取设备上可用摄像头的数量,再使用Camera.open()方法打开相应的摄像头。然后,可以使用设置Camera对象的参数来控制摄像头的功能,例如设置预览尺寸、图像帧率等。最后,通过Camera类的startPreview()方法开始预览,调用Camera类的setPreviewDisplay()方法将预览输出到指定的SurfaceView或TextureView中。 2. 使用Camera2 API: 在Android 5.0及以上版本,Google推出了新的相机API,即Camera2 API,它提供了更强大的相机控制能力。使用Camera2 API也可以实现外部摄像头切换。首先,你需要创建一个CameraManager对象,通过调用其getCameraIdList()方法获取可用摄像头的ID列表。然后,使用CameraManager的openCamera()方法打开相应的摄像头。接下来,创建一个CameraCaptureSession来进行预览或拍照操作,通过设置CaptureRequest的参数来控制摄像头的功能。最后,调用CameraCaptureSession的setRepeatingRequest()方法开始预览。 3. 使用第三方库:除了使用Android原生的相机API,还可以使用第三方库来实现外部摄像头切换。有一些开源的相机库,如OpenCV、CameraKit等,提供了简化相机开发的接口和功能,并且支持摄像头切换。 总之,无论你选择使用Camera API、Camera2 API还是第三方库,都可以实现Android上外部摄像头切换。具体的实现方式取决于你的需求和设备的兼容性。 ### 回答2: Android系统允许用户在设备上切换外部摄像头切换外部摄像头可以增加设备的拍摄选项,提供更多拍摄角度和功能。在Android系统中,外部摄像头可以使用USB连接或无线连接(如蓝牙)。以下是关于如何在Android设备上进行外部摄像头切换的步骤: 首先,确保你的设备上已连接外部摄像头,并且驱动程序已正确安装。 接下来,打开设备上的相机应用程序。通常,在主屏幕上可以找到相机应用的图标。 一旦相机应用程序打开,在屏幕上通常会有一个切换摄像头的按钮。这个按钮通常显示为相机图标,或是一个正方形内有一个相机图标。 点击切换摄像头按钮,系统将切换到外部摄像头。如果已经连接了多个外部摄像头,那么可能会出现一个列表供你选择。 选择你要切换到的外部摄像头,然后等待设备完成切换。 一旦切换完成,你可以拍摄照片或录制视频,使用外部摄像头提供的更多功能和角度。 如果你想再次切换摄像头,可以重复上述步骤。 需要注意的是,不同的设备和相机应用可能会有不同的界面和选项。在一些设备上,外部摄像头切换可能是隐藏在菜单中的选项,或者在设置中进行配置。所以,如果你在设备上找不到相应的按钮或选项,可以在相机应用程序中的设置或菜单中寻找。此外,还可以查找设备的用户手册或在互联网上搜索相关信息来获取更详细的指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值