安卓第一個項目

測試所有攝像頭

安卓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
英文地址,請注明出處:http://en.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;核心…