多个摄像头在一个Activity里显示

首先:系统需要支持对多摄像头的显示

然后上代码:

第一步,是View代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.csht.three.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <SurfaceView
            android:id="@+id/surfaceview1"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            />
        <SurfaceView
            android:id="@+id/surfaceview2"
            android:layout_width="fill_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            />
        <SurfaceView
            android:id="@+id/surfaceview3"
            android:layout_width="fill_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            android:layout_marginBottom="5dp"
            />
    </LinearLayout>
</LinearLayout>
第二步:
private int cameraCount;
private void DoIt() {
    cameraCount = Camera.getNumberOfCameras();
    for (int i = 0; i<cameraCount; i++){
        getSurfaceholder(i);
    }
}
private SurfaceHolder getSurfaceholder(int i){
    SurfaceHolder surfaceHolder = null;
    if (i==0){
        surfaceHolder = surfaceview1.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    if (i==1){
        surfaceHolder = surfaceview2.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    if (i==2){
        surfaceHolder = surfaceview3.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    return surfaceHolder;
}
第三步:
/**
 * Created by Administrator on 2017/7/17.
 */

public class surfaceholderCallbackBack implements SurfaceHolder.Callback {
    private Camera camera = null;
    private int cameraNum;
    private Context context;

    public surfaceholderCallbackBack(int cameraNum,Context context){
        this.cameraNum = cameraNum;
        this.context = context;
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 获取camera对象
        //int cameraCount = Camera.getNumberOfCameras();
            camera = Camera.open(cameraNum);
           try {
                // 设置预览监听
                camera.setPreviewDisplay(holder);
                Camera.Parameters parameters = camera.getParameters();
                if (context.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                    parameters.set("orientation", "portrait");
                    camera.setDisplayOrientation(90);
                    parameters.setRotation(90);
                } else {
                    parameters.set("orientation", "landscape");
                    camera.setDisplayOrientation(0);
                    parameters.setRotation(0);
                }
                camera.setParameters(parameters);
                // 启动摄像头预览
                camera.startPreview();
                System.out.println("camera.startpreview");

           } catch (IOException e) {
                e.printStackTrace();
                camera.release();
                System.out.println("camera.release");
            }
        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if (success) {
                    initCamera();// 实现相机的参数初始化
                    camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
                }
            }
        });

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    // 相机参数的初始化设置
    private void initCamera() {
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
        setDispaly(parameters, camera);
        camera.setParameters(parameters);
        camera.startPreview();
        camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
    }

    // 控制图像的正确显示方向
    private void setDispaly(Camera.Parameters parameters, Camera camera) {
        if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
            setDisplayOrientation(camera, 90);
        } else {
            parameters.setRotation(90);
        }

    }

    // 实现的图像的正确显示
    private void setDisplayOrientation(Camera camera, int i) {
        Method downPolymorphic;
        try {
            downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
            if (downPolymorphic != null) {
                downPolymorphic.invoke(camera, new Object[]{i});
            }
        } catch (Exception e) {
            Log.e("Came_e", "图像出错");
        }
    }
}



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,实现安卓app调取萤石云摄像头需要用到萤石云SDK。下面是一个简单的示例: 1. 在萤石云开发者中心申请AppKey和AppSecret,以获取SDK的使用权限。 2. 将萤石云SDK添加到您的项目中。您可以通过Gradle添加以下依赖: ```groovy implementation 'com.videogo:ezopenSDK:5.0.0' ``` 3. 在您的代码中调用SDK接口,实现调取摄像头的功能。以下是一个示例代码: ```java import com.videogo.openapi.EZOpenSDK; import com.videogo.openapi.bean.EZAccessToken; import com.videogo.openapi.bean.EZCameraInfo; import com.videogo.openapi.callback.OnEZAccessTokenCallback; import com.videogo.util.LogUtil; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final String APP_KEY = "您的AppKey"; private static final String APP_SECRET = "您的AppSecret"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化EZOpenSDK EZOpenSDK.showSDKLog(true); EZOpenSDK.enableP2P(true); EZOpenSDK.initLib(this, APP_KEY); // 获取AccessToken EZOpenSDK.getInstance().openLoginPage(new OnEZAccessTokenCallback() { @Override public void onAccessTokenResult(final EZAccessToken ezAccessToken) { // 获取AccessToken成功 LogUtil.i(TAG, "onAccessTokenResult: " + ezAccessToken.getAccessToken()); // 获取摄像头信息 EZOpenSDK.getInstance().getCameraInfo("您的摄像头序列号", new OnGetCameraInfoListener() { @Override public void onGetCameraInfoSuccess(EZCameraInfo ezCameraInfo) { // 获取摄像头信息成功 LogUtil.i(TAG, "onGetCameraInfoSuccess: " + ezCameraInfo.getCameraName()); // 打开实时预览页面 EZOpenSDK.getInstance().openCameraLivePlayPage(ezCameraInfo.getCameraId(), 1); } @Override public void onGetCameraInfoError(ErrorInfo errorInfo) { // 获取摄像头信息失败 LogUtil.e(TAG, "onGetCameraInfoError: " + errorInfo.getErrorCode()); } }); } @Override public void onAccessTokenError(ErrorInfo errorInfo) { // 获取AccessToken失败 LogUtil.e(TAG, "onAccessTokenError: " + errorInfo.getErrorCode()); } }, APP_KEY, APP_SECRET); } @Override protected void onDestroy() { super.onDestroy(); // 释放EZOpenSDK资源 EZOpenSDK.getInstance().releaseLib(); } } ``` 这段代码的作用是获取萤石云的AccessToken,然后获取指定摄像头的信息,最后打开实时预览页面。请将代码中的“您的AppKey”、“您的AppSecret”和“您的摄像头序列号”替换为实际的值。 需要注意的是,打开实时预览页面需要相应的权限,例如网络访问和摄像头访问权限。您需要在AndroidManifest.xml文件中添加以下权限声明: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> ``` 这样,就可以实现安卓app调取萤石云摄像头的功能了。如果您需要添加更多的功能,例如录制视频或拍照等,可以参考萤石云SDK相关文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值