Android Compose 调用系统相机拍照

在Android中,使用Compose调用系统相机拍照功能涉及到多个组件和步骤。下面是一个简单的例子,展示了如何在Compose中实现这一功能:

首先,确保你的Android项目已经添加了相机相关的权限。在AndroidManifest.xml文件中添加如下权限:

xml

<uses-permission android:name="android.permission.CAMERA" />

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

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

你需要一个启动相机应用的Intent。在Compose中,你可以创建一个RememberLauncher来处理这个任务。

创建一个相机界面,让用户能够触发拍照。

以下是一个简单的Compose代码示例,实现了上述功能:

kotlin

import androidx.compose.foundation.layout.Column

import androidx.compose.foundation.layout.fillMaxSize

import androidx.compose.material.Button

import androidx.compose.material.Text

import androidx.compose.runtime.*

import androidx.compose.ui.Modifier

import androidx.compose.ui.platform.LocalContext

import androidx.core.content.ContextCompat

import androidx.activity.compose.rememberLauncherForActivityResult

import androidx.activity.result.contract.ActivityResultContracts

import android.app.Activity

import android.content.Intent

import android.provider.MediaStore

@Composable

fun CameraApp() {

    var imagePath by remember { mutableStateOf<String?>(null) }

    val context = LocalContext.current

    val launcher = rememberLauncherForActivityResult(

        contract = ActivityResultContracts.StartActivityForResult()

    ) { result ->

        if (result.resultCode == Activity.RESULT_OK) {

            // 图片路径

            val imageUri = result.data?.data

            imagePath = getRealPathFromUri(context, imageUri!!)

        }

    }

    Column(modifier = Modifier.fillMaxSize()) {

        Button(

            onClick = {

                // 启动相机应用

                val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)

                launcher.launch(intent)

            }

        ) {

            Text("Take Photo")

        }

        if (imagePath != null) {

            Text(text = "Photo taken at: $imagePath")

        }

    }

}

fun getRealPathFromUri(context: Context, imageUri: Uri): String {

    val cursor = context.contentResolver.query(imageUri, null, null, null, null)

    cursor?.moveToFirst()

    val column_index = cursor?.getColumnIndex(MediaStore.Images.ImageColumns.DATA)

    val imagePath = column_index?.let { cursor.getString(it) }

    cursor?.close()

    return imagePath!!

}

这段代码首先定义了一个CameraApp的Composable函数,该函数包含了一个按钮,用户点击按钮时会启动系统相机应用。拍照完成后,结果会通过ActivityResultContracts.StartActivityForResult返回,我们通过rememberLauncherForActivityResult来记住这个回调。如果拍照成功,我们还会获取图片的路径并显示在界面上。

请注意,实际应用中,还需要处理权限请求等更多复杂的情况。此外,由于不同Android版本的相机API可能有所不同,你可能需要根据你的目标Android版本来调整代码。

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

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

相关文章

排序【数据结构】

文章目录 一、 稳定性二、排序1. 插入排序(1) 直接插入排序(2) 希尔排序 2. 选择排序(1) 直接选择排序(2) 堆排序 3. 交换排序(1) 冒泡排序(2) 快速排序① 普通版快排② 关于优化快排③ 快速排序的非递归方式 4. 归并排序5. 计数排序 三、 总结 一、 稳定性 在计算机科学中&am…

vue-cli 无法安装问题解决

在macOS上安装vue-cli&#xff0c;但一直都失败&#xff0c;最后终于解决。 先后报错了2个问题。 报错无法安装 其实原因是源被切断&#xff0c;默认的源是官方的&#xff0c;但在CN是无法正常访问&#xff0c;各种问题。直接将源修改才可以。但可能需要试多次。 npm config…

CHS_03.2.3.2_2+进程互斥的硬件实现方法

CHS_03.2.3.2_2进程互斥的硬件实现方法 知识总览中断屏蔽方法TestAndSet指令Swap指令 知识回顾 进程互斥的四种软件实现方法 知识总览 这个小节我们会介绍另外的三种进程互斥的硬件实现方法 那么 这个小节的学习过程当中 大家需要注意理解各个方法的原理 并且要稍微的了解各个…

【Uni-App】Vue3如何使用pinia状态管理库与持久化

安装插件 pinia-plugin-unistorage 引入 // main.js import { createSSRApp } from "vue"; import * as Pinia from "pinia"; import { createUnistorage } from "pinia-plugin-unistorage";export function createApp() {const app create…

SpringBoot不同的@Mapping使用

文章目录 一、介绍二、使用 一、介绍 一般Mapping类注解在Spring框架中用于将HTTP请求映射到对应的处理器方法。它们各自对应于不同类型的HTTP方法&#xff0c;主要用于RESTful Web服务中。以下是每个注解的作用&#xff1a; GetMapping: 用于映射HTTP GET请求到处理器方法。通…

Life is Strange 奇异人生汉化指南

奇异人生汉化指南 引言&#xff1a;在搜索引擎上看了许多的攻略&#xff0c;都无法得到指向性明确的安装步骤&#xff0c;其中最令人不解的分别为汉化包与汉化包的安装地址&#xff0c;以下会以汉化包获取与汉化包安装地址两个维度来确保汉化的正确&#xff0c;以及在最终附上…

爬虫学习笔记-get请求获取豆瓣电影排名多页数据★★★★★

1. 导入爬虫需要使用的包 import urllib.request import urllib.parse 2.创建请求函数 def create_request(page): # 定义不变的url部分 base_url https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action& # 根据规律定义data拼接url …

算法沉淀——二分查找(leetcode真题剖析)

算法沉淀——二分查找 01.二分查找02.在排序数组中查找元素的第一个和最后一个位置03.搜索插入位置04.x 的平方根05.山脉数组的峰顶索引06.寻找峰值07.寻找旋转排序数组中的最小值08.LCR 173. 点名 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

Log4j2的RollingFileAppender详解

RollingFileAppender&#xff1a;实现日志文件自动更新 当满足条件&#xff08;日志大小、指定时间等&#xff09;重命名或打包原日志文件进行归档&#xff0c;生成新日志文件用于日志写入。 参数TypeDescriptionnameStringThe name of the Appender.fileNameStringThe name …

幻兽帕鲁服务器怎么收费?4核16G配置

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云换手帕服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G3…

前言:穿越迷雾,探索C语言指针的奇幻之旅

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天给大家分享指针&#xff0c;内存和地址的使用&#xff0c;以及使用。 前言&#xff1a; 在编程的世界中&#xff0c;若论灵活多变、深邃神秘的角色&#xff0c;非“指针”莫属。如同哈利波特手中的魔…

深度学习快速入门--7天做项目

深度学习快速入门--7天做项目 0. 引言1. 本文内容2. 深度学习是什么3. 项目是一个很好的切入点4. 7天做项目4.1 第一天&#xff1a;数据整理4.2 第二天&#xff1a;数据处理4.3 第三天&#xff1a;简单神经网络设计4.4 第四天&#xff1a;分析效果与原因4.5 第五天&#xff1a;…

机电实务-7

1H431010计量的法律规定 1&#xff0e;器具的分类&#xff08;P429&#xff09; &#xff08;1&#xff09;计量基准器具 &#xff08;2&#xff09;计量标准器具 &#xff08;3&#xff09;工作计量器具 2&#xff0e;衡量计量器具的指标&#xff08;P429&#xff09; 衡量计量…

基于SpringBoot的玩具租赁系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Sentinel背后的原理:守卫你的代码安全之旅

大家好&#xff0c;今天我们要聊一聊Sentinel&#xff0c;这个神秘的名词可能让一些小白望而生畏&#xff0c;但别担心&#xff0c;我会用最通俗易懂的语言为你揭开它的神秘面纱。咱们一起深入了解&#xff0c;探讨 Sentinel 是如何守护你的代码安全的。 Sentinel 是什么&…

【原创课程】KUKA机器人与S7-1200进行Profinet通讯

一、KUKA机器人与S7-1200进行Profinet通讯 1、硬件配置 ①硬件配置 名称 型号 数量 PLC S7_1217C 1个 机器人 KUKA_KR-210 1台 2、机器人一侧参数配置 ①添加备选软件包 首先&#xff0c;从KUKA机器人控制柜中将KOP备选软件包拷贝出来&#xff0c;然后在”WorkVi…

【lodash.js】非常好用高性能的 JavaScript 实用工具库,防抖,深克隆,排序等

前言&#xff1a;lodash是一款前端必须要知道的js库&#xff0c;它里面提供了许多常用的功能和实用的工具函数 基本上我参与的项目中都有lodash&#xff0c;只能说lodash太强大了&#xff0c;lodash.js 提供了超过 300 个实用的工具函数&#xff0c;涵盖了很多常见的编程任务 l…

Compose | UI组件(八) | Dialog - 对话框

文章目录 前言Dialog 普通弹框Dialog 普通弹框的使用AlertDialog 警告弹框AlertDialog 警告弹框的使用 总结 前言 在我们传统的UI界面中&#xff0c;经常用到弹框&#xff0c;Compose也有弹框&#xff0c;但是Compose的弹框显示和隐藏和传统的弹框显示&#xff08;show&#x…

【ascii码对照表】

计算机各种表 ascii码表BCD码&#xff08;Binary-Coded Decimal‎&#xff09;有权码-8421码有权码-2421码有权码-5421码无权码-余3码无权码-余3循环码无权码-格雷码 ascii码表 BCD码&#xff08;Binary-Coded Decimal‎&#xff09; BCD码也称二进码十进数 BCD用4位二进制数来…