安卓第一个项目

测试所有摄像头

安卓CameraX:https://developer.android.com/media/grow/spatial-audio?hl=zh-cn

1、MainActivity.java

// 定义包名
package com.mms.densenapplication;// 引入 AppCompatActivity,支持兼容性更强的 Activity
import androidx.appcompat.app.AppCompatActivity;// 引入上下文和生命周期相关的类
import android.content.Context;
import android.os.Bundle;// 引入 CameraX 的预览控件
import androidx.camera.view.PreviewView;// Java 的集合类
import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.HashMap;// 下拉选择框相关类
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;// View 相关类
import android.view.View;// Camera2 API 相关类
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;// CameraX 核心组件
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.Preview;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.lifecycle.ProcessCameraProvider;// 异步执行与线程池
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;// 工具类
import android.util.Size;
import android.util.Log;import androidx.core.content.ContextCompat;// CameraX 与 Camera2 的互操作类
import androidx.camera.camera2.interop.Camera2CameraInfo;public class MainActivity extends AppCompatActivity {// 摄像头预览组件private PreviewView previewView;// 摄像头选择下拉框private Spinner cameraSpinner;// 用于显示在下拉框中的摄像头列表(带说明文字)private List<String> cameraIdList = new ArrayList<>();// 用于保存显示名和真实 cameraId 的映射关系private Map<String, String> cameraIdMap = new HashMap<>();// Camera2 管理器private CameraManager cameraManager;// CameraX 的生命周期相机提供器private ProcessCameraProvider cameraProvider;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载布局文件 activity_main.xmlsetContentView(R.layout.activity_main);// 获取布局中的预览视图和摄像头选择下拉框控件previewView = findViewById(R.id.previewView);cameraSpinner = findViewById(R.id.cameraSpinner);// 获取系统摄像头服务cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);try {// 遍历系统中所有摄像头for (String id : cameraManager.getCameraIdList()) {// 获取该摄像头的属性CameraCharacteristics cc = cameraManager.getCameraCharacteristics(id);// 获取摄像头朝向(前置/后置)Integer facing = cc.get(CameraCharacteristics.LENS_FACING);// 生成显示用的摄像头名称String name = "Camera ID: " + id;if (facing != null) {if (facing == CameraCharacteristics.LENS_FACING_BACK) name += " (BACK)";else if (facing == CameraCharacteristics.LENS_FACING_FRONT) name += " (FRONT)";else name += " (EXTERNAL)";}// 添加到显示列表和 ID 映射表中cameraIdList.add(name);cameraIdMap.put(name, id);}} catch (CameraAccessException e) {e.printStackTrace();}// 设置下拉框的适配器ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, cameraIdList);cameraSpinner.setAdapter(adapter);// 当用户选择某个摄像头时触发cameraSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {// 获取选中的显示项String selected = cameraIdList.get(position);// 查找对应的真实摄像头 IDString realCameraId = cameraIdMap.get(selected);// 调用绑定摄像头的方法if (realCameraId != null) {bindCamera(realCameraId);}}@Override public void onNothingSelected(AdapterView<?> parent) {}});// 异步获取 ProcessCameraProvider 实例(生命周期感知)ProcessCameraProvider.getInstance(this).addListener(() -> {try {cameraProvider = ProcessCameraProvider.getInstance(this).get();} catch (ExecutionException | InterruptedException e) {e.printStackTrace();}}, ContextCompat.getMainExecutor(this));}/*** 绑定指定 ID 的摄像头,并显示预览及处理图像帧*/private void bindCamera(String cameraId) {if (cameraProvider == null) return;// 解绑之前所有的摄像头使用cameraProvider.unbindAll();// 构建 CameraSelector,通过 cameraId 过滤匹配的摄像头CameraSelector cameraSelector = new CameraSelector.Builder().addCameraFilter(cameras -> {List<CameraInfo> matched = new ArrayList<>();for (CameraInfo info : cameras) {// 将 CameraInfo 转换为 Camera2CameraInfo 以获取其 cameraIdCamera2CameraInfo camera2CameraInfo = Camera2CameraInfo.from(info);if (camera2CameraInfo.getCameraId().equals(cameraId)) {matched.add(info);}}return matched;}).build();// 创建预览用的 Preview 对象,并设置其 SurfaceProviderPreview preview = new Preview.Builder().build();preview.setSurfaceProvider(previewView.getSurfaceProvider());// 创建图像分析器,并设置分辨率与策略ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().setTargetResolution(new Size(224, 224)) // 设置目标分辨率.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) // 丢弃旧帧.build();// 设置分析器线程和回调(这里只打印帧大小)imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {Log.d("CameraDebug", "Frame: " + image.getWidth() + "x" + image.getHeight());image.close(); // 一定要关闭,否则会卡住});// 将预览和分析器绑定到生命周期cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis);}
}

2、layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Spinnerandroid:id="@+id/cameraSpinner"android:layout_width="match_parent"android:layout_height="wrap_content" /><androidx.camera.view.PreviewViewandroid:id="@+id/previewView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/>
</LinearLayout>

3、build.gradle.kts(app)

import com.android.build.gradle.internal.packaging.createDefaultDebugStoreplugins {alias(libs.plugins.androidApplication)
}android {namespace = "com.mms.densenapplication"compileSdk = 34defaultConfig {applicationId = "com.mms.densenapplication"minSdk = 30targetSdk = 34versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"ndk {
//            abiFilters += listOf("armeabi-v7a", "arm64-v8a")abiFilters += listOf("arm64-v8a")}externalNativeBuild {cmake {cppFlags("")arguments("-DANDROID_STL=c++_shared")}}}signingConfigs{getByName("debug") {storeFile = file("${project.rootDir}/platform_2.0.jks")storePassword = "android"keyAlias = "androiddebugkey"keyPassword = "android"}}buildTypes {release {isMinifyEnabled = falseproguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = JavaVersion.VERSION_1_8}externalNativeBuild {cmake {path = file("src/main/cpp/CMakeLists.txt")version = "3.22.1"}}buildFeatures {viewBinding = true}aaptOptions {noCompress("dat", "zip", "bin", "")}
}dependencies {implementation(libs.appcompat)implementation("com.fasterxml.jackson.core:jackson-databind:2.15.0")implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.0")implementation(libs.material)implementation(libs.constraintlayout)testImplementation(libs.junit)androidTestImplementation(libs.ext.junit)androidTestImplementation(libs.espresso.core)implementation("androidx.camera:camera-camera2:1.3.0")  // 下面三个是摄像头相关implementation("androidx.camera:camera-lifecycle:1.3.0")implementation("androidx.camera:camera-view:1.3.0")
}

4、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"android:sharedUserId="android.uid.system"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.CAMERA" />  <!-- 摄像头权限 --><applicationandroid: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.DensenApplication"tools:targetApi="31"><uses-native-libraryandroid:name="libcdsprpc.so"android:required="true" /><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90128.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Gemini 体验

文章中代码仓库 gemini 谷歌推出的 AI 只能模型 Gemini官网Gemini ChatGemini开发者文档Gemini SDK 所有模型 模型变体输入输出优化目标Gemini 2.5 Pro gemini-2.5-pro音频、图片、视频、文本和 PDF文本增强的思考和推理能力、多模态理解能力、高级编码能力等Gemini 2.5 Fla…

Trae安装指定版本的插件

前情 Trae是属于国产的跟 Cursor类似的AI编程IDE&#xff0c;我也是第一时间体验Trae的&#xff0c;虽然相比Cursor弱了一些&#xff0c;但是也绝对胜任了&#xff0c;前端因为排队问题我转战了Cursor&#xff0c;等到Trae出收费模式前&#xff0c;我已经办了Cursor会员了&…

【技术追踪】用于医学图像合成和分割的噪声一致孪生扩散模型(CVPR-2025)

孪生扩散模型&#xff0c;生成息肉图像用于提升分割性能&#xff01; 论文&#xff1a;Noise-Consistent Siamese-Diffusion for Medical Image Synthesis and Segmentation 代码&#xff1a;https://github.com/Qiukunpeng/Siamese-Diffusion 0、摘要 深度学习已彻底革新医学影…

Crontab详解

crontab是Unix/Linux系统中用于设置周期性任务的工具&#xff0c;通过编辑配置文件实现定时执行命令或脚本。以下是其语法规则和核心要点&#xff1a; 一、基本格式 * * * * * command - - - - - | | | | | | | | | ----…

中国1km逐月潜在蒸散发数据集 - matlab按shp批量裁剪

中国1km逐月潜在蒸散发数据集 - matlab按shp批量裁剪 1. 数据概述 2 利用掩膜文件对数据进行裁剪 3 完整代码 4 结语 本篇继续处理气象数据,中国1km逐月潜在蒸散发数据集同前节介绍的中国1km降水数据集一样,都可以从国家青藏高原科学数据中心获得,数据具有同样的空间分辨率(…

Node.js链接MySql

前言&#xff1a; 在现代 Web 开发和后端服务中&#xff0c;Node.js 因其高性能和异步特性被广泛使用。MySQL 作为流行的关系型数据库之一&#xff0c;提供了稳定高效的数据存储和管理能力。将 Node.js 与 MySQL 结合&#xff0c;可以构建强大的数据驱动型应用。 一、环境准备…

Charles 的 Windows proxy 对爬取瑞数6 网站接口数据的作用分析

其实本文还是源于上个月的这篇文章 ➡️▼ 耗时两天半&#xff0c;利用 DrissionPage绕过瑞数6&#xff0c;爬取某药*局数据经历~ 不同点是&#xff0c;当时爬取的是列表页&#xff08;已爬完&#xff09;&#xff0c;后面爬取的是详情页&#xff01;懂的都懂&#xff0c;差别还…

PHP 测验

PHP 测验 引言 PHP 作为一种流行的开源服务器端脚本语言,被广泛应用于网页开发、服务器端编程等领域。为了帮助大家更好地理解和掌握 PHP,我们特此推出本 PHP 测验。通过以下问题,您可以检验自己的 PHP 知识水平,同时也能了解自己在哪些方面需要加强。 测验内容 问题一…

阶段1--Linux中的文件服务器(FTP、NAS、SSH)

目录 一、FTP Server 1.1.简介 1.2.FTP基础 1.2.1.控制端口 1.2.2.数据端口 1.3.FTP Server默认配置 1.3.1.安装vsftp 1.3.2.准备分发的文件 1.3.3.启动服务 1.3.4.关闭防火墙 1.4.FTP Client&#xff08;默认仅能下载文件&#xff09; 1.4.1.LinuxFTP客户端程序1&#xff1a;l…

SpringBoot与Vue实战:高效开发秘籍

Spring Boot 是什么? Spring Boot 简介 Spring Boot 是基于 Spring 框架的快速开发工具,旨在简化 Spring 应用的初始搭建和开发过程。它通过约定大于配置的原则,提供自动配置、内嵌服务器和依赖管理等功能,使开发者能够快速构建独立运行的、生产级别的应用。 核心特点 …

基于 fastapi 的 YOLO 批量目标检测 API:支持单图 / 文件夹自适应处理

项目背景 在计算机视觉任务中&#xff0c;我们经常需要对大量图片进行目标检测和标注。YOLO 系列模型凭借其高效性成为目标检测的首选工具之一&#xff0c;但批量处理图片时往往需要编写繁琐的脚本。本文将介绍一个基于 Flask 和 YOLOv11 的 API 服务&#xff0c;支持单张图片…

周志华《机器学习导论》第13章 半监督学习

目录 1. 未标记样本 2. 生成式方法 高斯混合EM 3. 半监督SVM 存在未标记样本的SVM变形 4. 图半监督学习 对图权值迭代矩阵计算 5. 基于分歧的方法 多视图协同训练 6. 半监督聚类 k-means的条件变形 6.1 Constrained k-means 利用“必连”与 “勿连”约束 6.2 Constra…

消息推送功能设计指南:精准触达与用户体验的平衡之道

消息推送功能设计指南&#xff1a;精准触达与用户体验的平衡之道消息推送是平台与用户保持连接的重要桥梁&#xff0c;既能及时传递重要资讯&#xff0c;又能唤醒沉睡用户、提升活跃度。然而&#xff0c;推送功能若设计不当&#xff0c;可能变成 “信息骚扰”&#xff0c;导致用…

CanOpen--SDO 数据帧分析

CanOpen--SDO 数据帧分析1 介绍1.1 概述1.2 主站与从站2 数据帧详细分析2.1 主站发送的请求帧 (Client → Server)2.2 从站响应的确认帧 (Server → Client)成功数据帧内容示例错误帧2.3 命令字2.4 小端格式&#xff1a;低字节在前3 其他示例60FF index 发送 数值 1000 数据帧分…

Day20-二叉树基础知识

二叉树&#xff08;Binary Tree&#xff09;是一种每个节点最多有两个子节点的树形数据结构&#xff0c;这两个子节点分别称为左子节点和右子节点。二叉树是计算机科学中最基础、最常用的树结构之一&#xff0c;广泛应用于搜索、排序、表达式解析等领域&#xff01; 核心特点 …

示波器探头接口类型与PINTECH品致探头选型指南

一、示波器探头接口类型及技术特点1. BNC接口&#xff1a;通用型主流标准- 优势&#xff1a;75%以上示波器标配接口&#xff0c;具备阻抗匹配灵活&#xff08;50Ω/1MΩ&#xff09;、插拔稳定、抗干扰性强等特点。 - 应用场景&#xff1a;适用于大多数示波器&#xff08;如Le…

Spring之【Bean工厂后置处理器】

目录 BeanFactoryPostProcessor BeanDefinitionRegistryPostProcessor 使用一下Bean工厂后置处理器 定义包扫描范围 定义一个组件Bean 定义一个普通的类 自定义一个组件类实现Bean工厂后处理器 测试类 BeanFactoryPostProcessor 该接口是Spring提供的扩展点之一是一个…

【C++】第十八节—一文万字详解 | map和set的使用

嗨&#xff0c;我是云边有个稻草人&#xff0c;与你分享C领域专业知识(*^▽^*) 《C》本篇文章所属专栏—持续更新中—欢迎订阅— 目录 一、序列式容器和关联式容器 二、set系列的使用 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 set的构造和迭代器 2.4 set的增删查…

Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用(357)

Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用&#xff08;357&#xff09;引言&#xff1a;正文&#xff1a;一、Java 构建的环境信息融合架构1.1 多传感器数据实时关联1.2 动态障碍物轨迹预测二、Java 驱动的决策系统设计2.1 紧急决策与…

单细胞转录组学+空间转录组的整合及思路

一、概念 首先还是老规矩&#xff0c;处理一下概念问题&#xff0c;好将之后的问题进行分类和区分 单细胞转录组&#xff1a;指在单个细胞水平上对转录组&#xff08;即细胞内所有转录出来的 RNA&#xff0c;主要是 mRNA&#xff09;进行研究的学科或技术方向&#xff0c;核心…