Android多媒体之调用摄像头和相册

Android调用摄像头拍照的使用

  1. 权限申请
    • 在AndroidManifest.xml文件中添加摄像头使用权限:
      <uses-permission android:name="android.permission.CAMERA"/>
    • 如果需要存储图片,还需要添加文件读写权限:
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    • 注意:在Android 6.0及以上版本,需要动态申请权限。
  2. 打开摄像头
    • 通过设置Intent来实现,指定Action为MediaStore.ACTION_IMAGE_CAPTURE
    • 如果需要处理拍照后的数据,可以使用startActivityForResult()方法启动相机。
  3. 拍照后传回数据处理
    • onActivityResult()方法中处理返回的Intent,从中获取拍照后的图片数据。
    • 可以使用data.getData()方法获取图片的Uri,然后使用图片加载库(如Glide)加载并显示图片。
  4. 存储图片
    • 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用file://URI。因此,需要使用FileProvider来共享文件。
    • 在AndroidManifest.xml中定义FileProvider,并配置相应的<meta-data>标签。
    • 创建一个File对象来存储拍照后的图片,并使用FileProvider.getUriForFile()方法获取该文件的Uri。
  5. 代码实现:

    首先,确保在AndroidManifest.xml中添加了必要的权限:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    Activity中:

    import android.Manifest;
    import android.content.ContentValues;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import java.io.File;
    import java.io.IOException;
    public class CameraActivity extends AppCompatActivity {
    private static final int REQUEST_CAMERA_PERMISSION = 1;
    private static final int REQUEST_IMAGE_CAPTURE = 2;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
    REQUEST_CAMERA_PERMISSION);
    } else {
    dispatchTakePictureIntent();
    }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
    @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CAMERA_PERMISSION) {
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    dispatchTakePictureIntent();
    }
    }
    }
    private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
    photoFile = createImageFile();
    } catch (IOException ex) {
    // Error occurred while creating the File
    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
    Uri photoURI = FileProvider.getUriForFile(this,
    "com.example.android.fileprovider",
    photoFile);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
    }
    }
    private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
    imageFileName, /* prefix */
    ".jpg", /* suffix */
    storageDir /* directory */
    );
    // Save a file: path for use with ACTION_VIEW intents
    CurrentPhotoPath = image.getAbsolutePath();
    return image;
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
    // Handle the image here (e.g., display it in an ImageView)
    // You can access the image file at CurrentPhotoPath
    }
    }
    // Other necessary methods and variables

从相册中选择图片的使用

  1. 权限申请
    • 与调用摄像头拍照相同,需要添加文件读写权限。
  2. 打开相册
    • 通过设置Intent来实现,指定Action为Intent.ACTION_PICK,并使用setDataAndType()方法设置数据类型为图片。
    • 同样,使用startActivityForResult()方法启动相册。
  3. 选择图片后处理
    • onActivityResult()方法中处理返回的Intent,从中获取用户选择的图片Uri。
    • 使用图片加载库加载并显示图片。
  4. 代码实现

    要在Android应用中实现从相册中选择图片的功能,你需要使用Intent.ACTION_GET_CONTENT。以下是如何实现这一功能的代码示例:

    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.content.FileProvider;
    public class AlbumActivity extends AppCompatActivity {
    private static final int REQUEST_SELECT_IMAGE = 3;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_album);
    // 启动相册选择图片
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(intent, REQUEST_SELECT_IMAGE);
    }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {
    if (data != null) {
    Uri selectedImageUri = data.getData();
    // 这里可以根据Uri进行图片处理,比如加载到ImageView中
    // 注意:对于Android 10 (API 级别 29) 及更高版本,你可能需要处理Scoped Storage
    // 如果你需要获取Bitmap对象,可以这样做(但请注意,这可能会消耗大量内存)
    try {
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri);
    // 使用Bitmap对象
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }

总结

调用摄像头拍照和从相册中选择图片在Android中都是常见的功能。它们都需要申请相应的权限,并通过设置Intent来启动相应的Activity。对于拍照功能,还需要考虑图片的存储和Uri的获取;对于从相册选择图片,主要是处理用户选择的图片Uri。在实际开发中,可以结合使用这些功能,为用户提供更丰富的图片获取方式。

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

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

相关文章

Jetson Orin安装部署和使用(1)

Jetson Orin使用 一、 安装NVIDIA-jetpack和基础开发环境 1、修改deb source sudo bash -c echo "deb https://repo.download.nvidia.com/jetson/common r34.1 main" >> /etc/apt/sources.list.d/nvidia-l4t-apt-source.listsudo bash -c echo "deb ht…

WSDM 2023 推荐系统相关论文整理(二)

WSDM 2023的论文录用结果已出&#xff0c;推荐系统相关的论文方向包含序列推荐&#xff0c;点击率估计等领域&#xff0c;涵盖图学习&#xff0c;对比学习&#xff0c;因果推断&#xff0c;知识蒸馏等技术&#xff0c;累计包含近四十篇论文&#xff0c;下文列举了部分论文的标题…

STM32H750外设ADC之外部触发和注入管理

目录 概述 1 外部触发转换和触发极性 1.1 外部触发条件 1.2 忽略硬件触发条件 1.3 触发框图 1.4 常规通道的外部触发 1.5 注入通道的外部触发 2 注入通道管理 2.1 触发注入模式 2.2 自动注入模式 2.3 注入转换延迟 概述 本文主要介绍STM32H750外设ADC之外部触发和注…

Win10 TiKV单机单节点Docker部署测试

1. 环境 环境&#xff1a;Windows10、WSL2、Ubuntu20.04、Docker Desktop目标&#xff1a;单节点单机部署&#xff0c;测试用 2. 前置操作 docker pull pingcap/tikv:latest docker pull pingcap/pd:latestmkdir -p /mnt/tikv/pd mkdir -p /mnt/tikv/tikvip a 命令查看虚拟…

PROFINET转CANOPEN(WL-ABC3033)连接台达伺服驱动器ASDA-B3

在工业自动化领域这片广阔天地中&#xff0c;通信协议的转换犹如一道横亘在工程师们面前的难题。特别是在将众多采用不同通信协议的设备汇聚一堂&#xff0c;共同协作完成任务的场景中&#xff0c;如何确保数据如丝般顺滑地穿梭于各个节点之间&#xff0c;确保每台设备都能心领…

在GEE中显示矢量或栅格数据的边界(包含样式设计)

需要保证最后显示的数据是一个 FeatureCollection 对象。 如果数据是一个 Geometry 或 Image&#xff0c;我们也可以使用 style 方法来设置样式并将其添加到地图上。以下是针对不同类型对象的处理方式&#xff1a; 1 Geometry对象 如果 table 是一个 Geometry 对象&#xff…

智慧社区信息化建设整体解决方案(PPT原件获取及软件各类建设方案)

智慧社区信息化系统建设要点可以归纳为以下几个方面&#xff1a; 一、社区基础设施建设 网络设施&#xff1a;建设高速网、城域网、校内网等网络&#xff0c;以满足社区信息传输和管理所需。信息终端设备&#xff1a;建设各种类型的智能终端设备&#xff0c;包括智能手机、智能…

子窗体关闭后父窗体操作

子窗体关闭后父窗体操作 子窗体代码: window.close();//关闭子窗体window.parent.opener.redirectOutList();父窗体: //子窗体关闭后父窗体重定向监控 function redirectOutList (){IOOP.getRequest("#es","sec/secdes.do",{pageNo:1,searchKey:}); }

【GD32F303红枫派使用手册】第八节 TIMER-RGB彩灯实验

8.1 实验内容 通过本实验主要学习以下内容&#xff1a; RGB彩灯控制原理 TIMER PWM输出原理 8.2 实验原理 本例程中使用的RGB彩灯采用共阳极驱动方式&#xff0c;使用三路PWM进行驱动&#xff0c;对应引脚输出低电平的时候对应RGB灯珠点亮&#xff0c;调节不同路的PWM占空…

FPGA新起点V1开发板(八-语法篇)——状态机

文章目录 一、两个状态机模型二、状态机设计&#xff08;四段论&#xff09;2.1 状态空间定义2.2 状态跳转&#xff08;时序逻辑&#xff09;2.3 下个状态判断&#xff08;组合逻辑&#xff09;2.4 各个状态下的动作2.5 三段式 一、两个状态机模型 二、状态机设计&#xff08;四…

学习java第九十天

​ Spring 框架有什么优势? 轻量级: 在尺寸和透明度方面Spring 是轻量级的。spring框架的基础版本只有大约 2MB 大小。 控制反转 (IOC):通过控制反转技术 &#xff0c;Spring实现了松耦合。对象间只是给出了依赖性&#xff0c;而不是创建或寻找依赖对象。 面向切面 (AOP): …

在Linux/Ubuntu/Debian中使用lscpu命令查看CPU信息

lscpu 是一个用于显示 CPU 架构信息的命令 lscpu 是一个用于显示 CPU 架构信息的命令。它从 /proc/cpuinfo 文件中读取数据&#xff0c;并以易于理解的方式呈现。使用该命令可以快速获取 CPU 的详细信息&#xff0c;如处理器型号、核心数量、线程数等。 常见用法&#xff1a;…

Linux的shell脚本中的比大小

如果要将 -le 换成相反的&#xff08;即“大于”&#xff09;&#xff0c;你应该使用 -gt&#xff08;greater than&#xff09;。 所以&#xff0c;-le 的相反比较是 -gt。 但如果你想要一个包含“大于”和“不等于”的比较&#xff08;即“大于”&#xff09;&#xff0c;那…

用户投诉对旅行社复购率有什么影响?该如何分析投诉数据?

随着在线旅游市场的不断扩大&#xff0c;旅游平台的用户基数和交易量持续增长&#xff0c;用户投诉作为服务质量的反馈机制&#xff0c;其重要性日益凸显。用户投诉不仅反映了旅游服务中存在的问题&#xff0c;也是推动平台中的旅行社改进服务、提升用户体验的重要动力。然而&a…

vscode导入自定义模块报错ModuleNotFoundError解决方案

问题描述 我的项目为great_gas_or_agents&#xff0c;目录结构如下&#xff1a; log_data_extract main.py math_algorithm 现在我运行main.py&#xff0c;报错&#xff1a;from math_algorithm.utils import parse_month_match_request&#xff0c;ModuleNotFoundError: No …

接口自动化-预期值和实际值怎么写?

测试类当中 怎么做接口自动化&#xff0c;返回值校验&#xff0c;就是需要返回值的预期值和实际值进行对比 实际值如下 怎么拿到预期值$.msg?用正则表达式-提取值 建新的类-来编写用正则表达式拿到预期值 源码pattern 使用的compile的方法&#xff0c;传入的是字符串正则表…

短剧cps系统搭建开发,热门短剧推广分销系统。短剧分销是怎么操作的?

目录 前言&#xff1a; 二、短剧是怎么推广分销的&#xff1f; 二、 短剧分销系统有什么功能&#xff1f; 三、怎么搭建&#xff1f; 总结&#xff1a; 前言&#xff1a; 短剧分销项目目前的现状是多元化且充满活力的。随着短剧市场的快速发展和观众接受度的提高&#xff0…

大功率LED照明芯片OC6781输入5V~36V,PWM升压型LED恒流驱动器

概述 OC6781是一款高效率、高精度的升压型LED恒流驱动控制芯片。OC6781内置高精度误差放大器&#xff0c;振荡器&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率、多个高亮度LED灯串恒流驱动。OC6781采用固定频率的PWM控制方式&#xff0c;工作频率可通过外部电阻进行设…

MySQL的组成与三种log

MySQL由几块组成 连接器分析器优化器执行器 MySQL的三大log blog 作用&#xff1a; 用于主从同步与数据恢复 记录内容&#xff1a; 已经完成的 DML(数据操作语句)&#xff0c;主要是用于数据备份 redolog<重试日志> 作用&#xff1a; 崩溃恢复&#xff0c;用于事…

【CSS】aspect-ratio属性详解

目录 基本语法示例讲解保持图片的宽高比使用 aspect-ratio 创建响应式嵌入视频正方形元素 与其他属性的结合 aspect-ratio 属性是 CSS 中的一个有用属性&#xff0c;它允许你轻松地设置元素的宽高比。这个属性可以确保元素在不同屏幕尺寸和容器大小下保持一定的宽高比&#xff…