当前位置: 首页 > article >正文

使用 ARCore 和 Kotlin 开发 Android 增强现实应用入门指南

环境准备

1. 工具与设备要求

  • Android Studio:Arctic Fox 或更高版本
  • 设备:支持 ARCore 的 Android 设备(查看支持列表)
  • 依赖库
    // build.gradle (Module级)
    dependencies {implementation 'com.google.ar:core:1.35.0'implementation 'com.google.ar.sceneform:core:1.17.1'implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.17.1'
    }
    

基础实现步骤

1. 配置 AndroidManifest.xml

<!-- 添加权限和AR特性 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.ar" android:required="true" /><application><!-- 声明AR元数据 --><meta-dataandroid:name="com.google.ar.core"android:value="required" />
</application>

2. 创建完整布局文件

<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/arFragment"android:name="com.google.ar.sceneform.ux.ArFragment"android:layout_width="match_parent"android:layout_height="match_parent" /></FrameLayout>

3. 完整 Kotlin 主活动代码

// MainActivity.kt
import android.net.Uri
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.ar.core.ArCoreApk
import com.google.ar.core.Config
import com.google.ar.core.Session
import com.google.ar.sceneform.AnchorNode
import com.google.ar.sceneform.rendering.ModelRenderable
import com.google.ar.sceneform.ux.ArFragment
import com.google.ar.sceneform.ux.TransformableNodeclass MainActivity : AppCompatActivity() {private lateinit var arFragment: ArFragmentprivate var isArSupported = falseoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)checkARSupport()setupARScene()}// 检查AR支持性private fun checkARSupport() {val availability = ArCoreApk.getInstance().checkAvailability(this)when {availability.isSupported -> {isArSupported = trueArCoreApk.getInstance().requestInstall(this, true)}availability.isTransient -> {// 如果状态是暂时未知,延迟后重新检查Handler(Looper.getMainLooper()).postDelayed({checkARSupport()}, 200)}else -> {Toast.makeText(this, "设备不支持AR", Toast.LENGTH_LONG).show()finish()}}}// 初始化AR场景private fun setupARScene() {arFragment = supportFragmentManager.findFragmentById(R.id.arFragment) as ArFragment// 配置AR会话arFragment.arSceneView.scene.addOnUpdateListener { frameTime ->arFragment.arSceneView.scene.getCamera()?.let { camera ->// 在此处添加每帧更新的逻辑}}// 设置点击监听器arFragment.setOnTapArPlaneListener { hitResult, plane, motionEvent ->placeModel(hitResult.createAnchor())}}// 放置3D模型private fun placeModel(anchor: Anchor) {ModelRenderable.builder().setSource(this, Uri.parse("model.sfb")) // 替换为你的模型路径.build().thenAccept { modelRenderable ->val anchorNode = AnchorNode(anchor)anchorNode.setParent(arFragment.arSceneView.scene)val modelNode = TransformableNode(arFragment.transformationSystem)modelNode.renderable = modelRenderablemodelNode.setParent(anchorNode)modelNode.select() // 自动显示变换控制器}.exceptionally { throwable ->Toast.makeText(this, "模型加载失败: ${throwable.message}", Toast.LENGTH_LONG).show()null}}
}

4. 模型资源配置

  1. 准备模型文件
    • .obj.mtl 文件放入 app/src/main/assets
    • 创建 model.sfa 描述文件:
      // model.sfa
      {"resources": [{"filename": "model.obj","material": "model.mtl"}]
      }
      
  2. 配置 Gradle 转换任务
    plugins {id 'com.google.ar.sceneform.plugin'
    }sceneform.asset('src/main/assets/model.obj','default','src/main/assets/model.sfa','src/main/assets/model.sfb'
    )
    

高级功能扩展

1. 平面检测可视化

// 在setupARScene()中添加:
arFragment.arSceneView.planeRenderer.isVisible = true
arFragment.arSceneView.planeRenderer.material.thenAccept { material ->material.setFloat3("color", Color(0.3f, 0.7f, 0.3f))}

2. 光照估计

// 在每帧更新中获取光照信息
arFragment.arSceneView.scene.addOnUpdateListener { frameTime ->val frame = arFragment.arSceneView.arFrameval lightEstimate = frame?.lightEstimatelightEstimate?.let {val intensity = it.pixelIntensity// 根据光照强度调整模型材质}
}

常见问题解决

1. 黑屏问题排查

  • 检查相机权限是否动态申请:
    // 在onCreate()中添加权限检查
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)
    }
    

2. 模型位置偏移

  • 调整模型原点:
    modelNode.localPosition = Vector3(0f, 0.5f, 0f) // 在Y轴上抬高0.5米
    

完整项目结构

app/
├── src/
│   ├── main/
│   │   ├── assets/
│   │   │   ├── model.obj
│   │   │   ├── model.mtl
│   │   │   └── model.sfa
│   │   ├── java/
│   │   │   └── com.example.arapp/
│   │   │       └── MainActivity.kt
│   │   └── res/
│   │       └── layout/
│   │           └── activity_main.xml
└── build.gradle

运行与调试

  1. 设备要求
    • 确保设备已安装 Google Play Services for AR
  2. 调试技巧
    // 启用调试模式
    arFragment.arSceneView.arFrame?.let { frame ->Log.d("AR_DEBUG", "跟踪状态: ${frame.camera.trackingState}")
    }
    

下一步学习方向

  • 手势交互:实现模型的旋转/缩放/平移
  • 遮挡处理:使用深度API实现真实遮挡效果
  • 多人共享:通过Cloud Anchors实现多设备协同

建议从简单模型开始,逐步添加复杂功能。

相关文章:

使用 ARCore 和 Kotlin 开发 Android 增强现实应用入门指南

环境准备 1. 工具与设备要求 Android Studio&#xff1a;Arctic Fox 或更高版本设备&#xff1a;支持 ARCore 的 Android 设备&#xff08;查看支持列表&#xff09;依赖库&#xff1a;// build.gradle (Module级) dependencies {implementation com.google.ar:core:1.35.0im…...

Android Studio Kotlin 中的方法添加灰色参数提示

在使用 Android Studio 时&#xff0c; 我发现使用 Java 编写方法后在调用方法时&#xff0c; 会自动显示灰色的参数。 但在 Kotlin 中没有显示&#xff0c; 于是找了各种方法最后找到了设置&#xff0c; 并且以本文章记录下来。 博主博客 https://blog.uso6.comhttps://blog.…...

TCP协议简介

TCP 协议 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议套件中的核心协议之一&#xff0c;位于传输层。它提供了一种可靠的、面向连接的、基于字节流的数据传输服务。TCP 的主要特点是确保数据在传输过程中不丢失、不重复&a…...

Linux学习心得问题整理(二)

day05 Linux基础入门 Linux语法解析 如何理解ssh远程连接?如何使用ssh使用远程连接服务&#xff1f; ssh进也称远程服务终端&#xff0c;常见连接方式可以包括windows和Linux两种方式 首先咱们使用windows窗口进行连接&#xff0c;这里就采用xshell连接工具来给大家做演示吧…...

SOC-ESP32S3部分:2-2-VSCode进行编译烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/CTzVw8p4LiaetykurbTciA42nBf?fromScenespaceOverview 无论是使用Window搭建IDF开发环境&#xff0c;还是使用Linux Ubuntu搭建IDF开发环境&#xff0c;我们都建议使用VSCode进行代码编写和编译&#xff0c;VSCode界面友好&#x…...

数据可视化热图工具:Python实现CSV/XLS导入与EXE打包

在数据分析工作中,热图(Heatmap)是一种非常直观的可视化工具,能够清晰展示数据矩阵中的数值分布和相关性。本文将介绍如何使用Python构建一个支持CSV/XLS文件导入、热图生成并可打包为EXE的桌面应用程序。 核心功能设计 我们的热图工具将包含以下核心功能: 支持CSV和Excel…...

Python虚拟环境再PyCharm中自由切换使用方法

Python开发中的环境隔离是必不可少的步骤,通过使用虚拟环境可以有效地管理不同项目间的依赖,避免包冲突和环境污染。虚拟环境是Python官方提供的一种独立运行环境,每个项目可以拥有自己单独的环境,不同项目之间的环境互不影响。在日常开发中,结合PyCharm这样强大的IDE进行…...

使用 Terraform 创建 Azure Databricks 工作区

使用 Terraform 创建 Azure Databricks Terraform 是一种基础设施即代码(IaC)工具,允许用户通过声明式配置文件来管理和部署云资源。Azure Databricks 是一个基于 Apache Spark 的分析平台,专为数据工程和数据科学设计。通过 Terraform,可以自动化 Azure Databricks 的创…...

使用Mathematica绘制一类矩阵的特征值图像

学习过线性代数的&#xff0c;都知道&#xff1a;矩阵的特征值非常神秘&#xff0c;但却携带着矩阵的重要信息。 今天&#xff0c;我们将展示&#xff1a;一类矩阵&#xff0c;其特征值集体有着很好的分布特征。 modifiedroots[c_List] : Block[{a DiagonalMatrix[ConstantAr…...

GitHub 趋势日报 (2025年05月18日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 2027⭐ 23993Roff2public-apis/public-a…...

SpringBoot-6-在IDEA中配置SpringBoot的Web开发测试环境

文章目录 1 环境配置1.1 JDK1.2 Maven安装配置1.2.1 安装1.2.2 配置1.3 Tomcat1.4 IDEA项目配置1.4.1 配置maven1.4.2 配置File Encodings1.4.3 配置Java Compiler1.4.4 配置Tomcat插件2 Web开发环境2.1 项目的POM文件2.2 项目的主启动类2.3 打包为jar或war2.4 访问测试3 附录3…...

JVM 工具实战指南(jmap / jstack / Arthas / MAT)

&#x1f50d; 从诊断到定位&#xff1a;掌握生产级 JVM 排查工具链 &#x1f4d6; 前言&#xff1a;系统故障时&#xff0c;如何快速定位&#xff1f; 无论 JVM 理论多么扎实&#xff0c;当线上服务出现 CPU 飙高、响应超时、内存泄漏或频繁 Full GC 时&#xff0c;仅靠猜测…...

基于springboot+vue的病例管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 患者信息管理 医…...

SpringBoot(三)--- 数据库基础

目录 前言 一、MySQL 1. 关系型数据库 2.数据模型 二、SQL语句 1.DDL语句 1.1 数据库操作 1.1.1 查询数据库 1.1.2 创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2 表操作 1.2.1 创建表 1.2.2 约束 1.2.3 数据类型 2.DML语句 2.1 增加&#xff08;insert&…...

【漫话机器学习系列】268. K 折交叉验证(K-Fold Cross-Validation)

图解 K 折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;| 原理 数学公式 实践应用 原图作者&#xff1a;Chris Albon&#xff0c;手绘风格清晰易懂&#xff0c;本文基于其图解做详细扩展&#xff0c;适用于机器学习、深度学习初学者及进阶者参考学习。 一、什么是…...

【学习心得】Jupyter 如何在conda的base环境中其他虚拟环境内核

如果你在conda的base环境运行了jupyter lab打开了一个ipynb文本&#xff0c;此时选择的内核是base虚拟环境的Python内核&#xff0c;如果我想切换成其他conda虚拟环境来运行这个文件该怎么办&#xff1f;下面我们试着还原一下问题&#xff0c;并且解决问题。 【注】 这个问题出…...

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...

学习VS2022离线安装包的下载方法

VS2022企业版、专业版和社区版都支持在线安装和离线安装两种方式&#xff0c;一般而言&#xff0c;联网的电脑基本都用在线安装&#xff0c;上网不方便时就需要使用离线安装包安装。完整的VS2022离线安装包有几十个G&#xff08;前几天测试时下载VS2022企业版包含所有组件的中文…...

前端开发中的AI辅助测试:从手动到智能的转变

&#x1f9ea; 前端开发中的AI辅助测试&#xff1a;从手动到智能的转变 &#x1f464; 作者&#xff1a;喜葵 &#x1f4c5; 更新时间&#xff1a;2025-05-16 &#x1f4d6; 前言 前端测试一直是开发流程中的痛点&#xff1a;写测试代码耗时、维护成本高、覆盖率难提升。随着A…...

Nginx配置记录访问信息

文章目录 方法一&#xff1a;使用Nginx原生配置记录访问信息方法二&#xff1a;使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如&#xff1a;Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中&#xff0c;无论是功…...

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…...

JAVA EE(进阶)_HTML

思如云烟&#xff0c;行若磐石。 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE&#xff08;进阶&#xff09;_进阶的开端-CSDN博客 1.HTML HTML&#xff08;HyperText Mark…...

自定义类、元组、字典和结构体对比——AutoCAD C# 开发中建立不同对象之间的联系

以下是对它们的详细分析和对比&#xff1a; 1. 自定义类&#xff08;Class&#xff09; 优势 封装性强&#xff1a;可以定义字段、属性、方法和事件&#xff0c;实现复杂的行为和逻辑。继承与多态&#xff1a;支持继承体系&#xff0c;可通过接口或抽象类实现多态。引用类型…...

鸿蒙北向源码开发: 检查应用接口dts文件api规范性

开源鸿蒙5.0.2对应的api版本是14 5.0社区仓有工具检查接口规范性报告工具: interface/sdk-js/build-tools/api_check_plugin api_check_plugin是什么? 在解释api_check_plugin是什么之前得先知道 应用调用的api接口都是文件名后缀为.d.ts的文件,这些文件内部声明了arkts的a…...

谷歌 NotebookLM 即将推出 Sparks 视频概览:Gemini 与 Deep Research 加持,可生成 1 - 3 分钟 AI 视频

近期&#xff0c;谷歌旗下的 NotebookLM 即将推出一项令人瞩目的新功能 ——Sparks 视频概览。这一功能借助 Gemini 与 Deep Research 的强大能力&#xff0c;能够生成 1 - 3 分钟的 AI 视频&#xff0c;为用户带来全新的内容创作与信息获取体验。 NotebookLM&#xff1a;AI 笔…...

5月19日笔记

BGP的路由聚合 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是互联网中用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息的一种协议。在BGP中&#xff0c;路由聚合是一种技术&#xff0c;它允许网络管理员通过减少路由表中冗余的…...

从基础到高级:网站反爬技术全景解析与第三方工具对比

网站反爬与用户行为检测实战指南:从基础防护到智能识别 在当今数据驱动的互联网时代,网站面临着日益复杂的爬虫攻击和恶意行为威胁。本文将系统性地介绍网站反爬与用户行为检测的技术体系,包括基本原理、防护策略、第三方组件选型以及真实案例分析,帮助开发者构建更加安全…...

Java面试实战:从Spring Boot到分布式缓存的深度探索

Java面试实战&#xff1a;从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂&#xff0c;面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信&#xff0c;迎接这场技术“拷问”。 第一轮&#xff1a;基础问题 老王&#…...

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心&#xff0c;构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路&#xff0c;通过分层递进的知识模块帮助学员建立系统…...

pytorch小记(二十):深入解析 PyTorch 的 `torch.randn_like`:原理、参数与实战示例

pytorch小记&#xff08;二十&#xff09;&#xff1a;深入解析 PyTorch 的 torch.randn_like&#xff1a;原理、参数与实战示例 一、函数签名与参数详解二、torch.randn_like vs torch.randn三、基础示例四、进阶用法与参数覆盖4.1 覆盖数据类型&#xff08;dtype&#xff09;…...