首页 > 其他分享 >android8 rk3399 同时支持多个USB摄像头

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

时间:2023-04-20 23:32:21浏览次数:41  
标签:surfaceViewList USB android8 camera surfaceHolderList add rk3399 import android



文章目录

  • 一、前文
  • 二、CameraHal_Module.h
  • 三、CameraHal_Module.cpp
  • 四、编译&烧录Image
  • 五、App验证


一、前文

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

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

二、CameraHal_Module.h

  • 修改CAMERAS_SUPPORT_MAX
  • android8 rk3399 同时支持多个USB摄像头_CameraHal_02


三、CameraHal_Module.cpp

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

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

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

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

四、编译&烧录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>

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


标签:surfaceViewList,USB,android8,camera,surfaceHolderList,add,rk3399,import,android
From: https://blog.51cto.com/u_16081772/6210896

相关文章

  • 大揭秘!瑞芯微RK3568对比RK3399性能解析
    RK3568核心板简介​RK3568核心板是武汉万象奥科基于瑞芯微Rockchip的RK3568设计的一款高性能核心板。它采用四核Cortex-A55架构,最高主频可达2.0GHz,同时集成Mali-G522EEGPU,支持[email protected]/H.264/VP9解码和[email protected]/H.264编码。此外,RK3568支持多种接口,包括USB3.0、PC......
  • CH224单芯片集成USB PD等多种快充协议
    CH224单芯片集成PD3.0/2.0,BC1.2等升压快充协议,内置PD通讯模块,高集成度,外围精简。支持输出电压检测功能,并且提供过温、过压保护等。可广泛应用于各类电子设备拓展高功率输入,如无线充电器、电动牙刷、锂电池电动工具等各类应用场合。2、功能特点l l l l l支持5V至15V输入电压支持......
  • USB
    USB介绍  USB,通用串行总线,支持热插拔,为了解决即插即用的需求,USB2.0比较常用。由于USB是主从模式的结构,设备与设备、主机与主机相互之间不能互联,为了解决这个问题,出现了USBOTG(onthego),同一个设备在不同场合下可以在主从机之间切换。  特点  usb2.0以上支持480Mb/s高速模......
  • 虚拟机Virtualbox 识别不到USB设备 的解决办法
    Linux系统安装Windows虚拟机,Virtualbox的USB设备筛选器中找不到连接的usb设备,解决办法如下:步骤:1、安装扩展包VirtualboxExtensionPack。扩展包可在官网下载。   下载完后,点击Virtualbox“管理——工具——ExtensionPackManager”,选择“Install”,添加扩展包Virt......
  • zynq7010,petalinux, USB-wifi测试
    zynq7010,基于linux验证USB-wifi功能1.相关电路图,这里貌似复位键默认上电开启的,引脚并没有印出来需要注意的地方注意芯片型号"USB3320",这个在linux内核中如果USB配置正确的话是会被打印出来的usbcore:registerednewinterfacedriverusb-storagechipidea-us......
  • win7怎么usb启动
    有些用户在重装系统时喜欢用u盘来操作,但有些用户却不知道win7系统该怎么用USB启动,这里就给大家简单介绍一下具体的操作方法,希望对您有所帮助。win7怎么usb启动1、首先将U盘插入,开机的时候按住“DEL”按键,进入BIOS启动项设置页面。2、然后在界面中选择“AdvancedBIOSFeatures......
  • 汉源高科VGA光端机+1路立体声音频+USB鼠标键盘控制光纤延长器
    汉源高科VGA光端机+1路立体声音频+USB鼠标键盘控制光纤延长器......
  • 汉源高科高清DVI音视频光端机+USB键盘鼠标KVM控制dvi光纤收发器延长器
    汉源高科高清DVI音视频光端机+USB键盘鼠标KVM控制dvi光纤收发器延长器......
  • RK3399+麒麟工业平板解决方案
    1、RK3568Linux麒麟系统陀螺仪驱动调试瑞星微开发板自带的陀螺仪型号MXC6655xa,硬件人员说我们的板子和开发板一样,因此检查设备树文件找到设备描述:&i2c5{status=“okay”;mxc6655xa:mxc6655xa@15{status=“okay”;compatible=“gs_mxc6655xa”;......
  • usb3.0能插到2.0口用
    usb3.0能插到2.0口用吗的,不过就算插到2.0的口上的话也是只有2.0的传输速率,并不能拥有更快的传输速率,3.0是可以和2.0互相插拔的,还是很方便的。usb3.0能插到2.0口用:答:可以的usb3.0能插到2.0口的,不过速率是一样的,并不会做出改变。我们将3.0插到2.0上的话只有2.0的传输速率。usb......