android8 rk3399 同时支持多个USB摄像头

一、前文

  • Android系统默认支持2个摄像头,一个前置摄像头,一个后置摄像头
  • 需要支持数量更多的摄像头,得修改Android Hal层的代码

在这里插入图片描述

二、CameraHal_Module.h

  • 修改CAMERAS_SUPPORT_MAX
    在这里插入图片描述

三、CameraHal_Module.cpp

  • 修改camera_get_number_of_cameras()函数中变量camInfoTmp[]相关代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、编译&烧录Image

该部分的修改要生效的话,需要进行全编译

  • ./build.sh
  • ./build.sh mkimage
  • ./build.sh mkupdate

五、App验证

  • AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

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


    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.CameraApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>
  • MainActivity.java
package com.example.cameraapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    
    
    private static final String TAG = MainActivity.class.getSimpleName();


    Camera camera1, camera2, camera3, camera4;
    SurfaceHolder surfaceHolder1, surfaceHolder2, surfaceHolder3, surfaceHolder4;
    SurfaceView surfaceView1, surfaceView2, surfaceView3, surfaceView4;

    List<Camera> cameraList = new ArrayList<>();
    List<SurfaceHolder> surfaceHolderList = new ArrayList<>();
    List<SurfaceView> surfaceViewList = new ArrayList<>();

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

        surfaceView1 = findViewById(R.id.camera_surface_view1);
        surfaceView2 = findViewById(R.id.camera_surface_view2);
        surfaceView3 = findViewById(R.id.camera_surface_view3);
        surfaceView4 = findViewById(R.id.camera_surface_view4);

        cameraList.add(camera1);
        cameraList.add(camera2);
        cameraList.add(camera3);
        cameraList.add(camera4);

        surfaceHolderList.add(surfaceHolder1);
        surfaceHolderList.add(surfaceHolder2);
        surfaceHolderList.add(surfaceHolder3);
        surfaceHolderList.add(surfaceHolder4);

        surfaceViewList.add(surfaceView1);
        surfaceViewList.add(surfaceView2);
        surfaceViewList.add(surfaceView3);
        surfaceViewList.add(surfaceView4);

        for(int i=0; i<cameraList.size(); i++){
    
    
            initCamera(i, cameraList.get(i), surfaceHolderList.get(i), surfaceViewList.get(i));
        }

        int number = Camera.getNumberOfCameras();//得到摄像头的个数
        Toast.makeText(MainActivity.this, "摄像头个数:"+number, Toast.LENGTH_LONG).show();
    }


    private void initCamera(int number, Camera camera, SurfaceHolder surfaceHolder, SurfaceView surfaceView){
    
    
        try{
    
    
            camera = Camera.open(number);
            surfaceHolder = surfaceView.getHolder();
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

            final Camera mCamera = camera;
            surfaceHolder.addCallback(new SurfaceHolder.Callback() {
    
    
                @Override
                public void surfaceCreated(SurfaceHolder surfaceHolder) {
    
    
                    try {
    
    
                        if (mCamera!=null) {
    
    
                            mCamera.setPreviewDisplay(surfaceHolder);
                            mCamera.setDisplayOrientation(90);
                            mCamera.startPreview();
                        }
                    } catch (Exception e) {
    
    
                        e.printStackTrace();
                    }
                }
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    
    }
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
    
    
                    releaseCamera(mCamera);
                }
            });
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }

    /**
     * 释放相机资源
     */
    private void releaseCamera(Camera camera) {
    
    
        if (camera != null) {
    
    
            camera.setPreviewCallback(null);
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    /**
     * 释放相机资源
     */
    private void releaseAllCamera() {
    
    
        for(int i=0; i<cameraList.size(); i++){
    
    
            if (cameraList.get(i) != null) {
    
    
                cameraList.get(i).setPreviewCallback(null);
                cameraList.get(i).stopPreview();
                cameraList.get(i).release();
                cameraList.set(i, null);
            }
        }
    }
}
  • activity_main.xml
<?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=".MainActivity">

<!--    <TextView-->
<!--        android:layout_gravity="center"-->
<!--        android:layout_margin="10dp"-->
<!--        android:layout_width="wrap_content"-->
<!--        android:layout_height="wrap_content"-->
<!--        android:text="摄像头个数:"-->
<!--        app:layout_constraintBottom_toBottomOf="parent"-->
<!--        app:layout_constraintEnd_toEndOf="parent"-->
<!--        app:layout_constraintStart_toStartOf="parent"-->
<!--        app:layout_constraintTop_toTopOf="parent" />-->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="1">
        <SurfaceView
            android:id="@+id/camera_surface_view1"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
        <SurfaceView
            android:id="@+id/camera_surface_view2"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="1">
        <SurfaceView
            android:id="@+id/camera_surface_view3"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
        <SurfaceView
            android:id="@+id/camera_surface_view4"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
    </LinearLayout>


</LinearLayout>

觉得好,就一键三连呗(点赞+收藏+关注)

猜你喜欢

转载自blog.csdn.net/kangweijian/article/details/129560448