Android---打开相机拍照

简单实现打开系统系统相机拍一张图片并显示在UI上,适用与个人主页头像的切换。

1. 添加权限。AndroidManifest.xml里添加使用相机的权限。

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

2. 布局。布局内容比较交单,一个Button用来打开相机;一个ImageView用来接收拍摄的图片。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_open_gallery"android:layout_width="150dp"android:layout_height="75dp"android:layout_centerHorizontal="true"android:text="拍照"android:textSize="20sp"/><ImageViewandroid:id="@+id/img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:layout_below="@+id/btn_open_gallery"/></RelativeLayout>

3. 动态申请权限。Google 在 Android 6.0 开始引入了权限申请机制,除了在AndroidManifest.xml里申请静态权限,还需要在代码里动态申请。这里需要申请系统相机的权限。

    /*** 申请动态权限*/private void requestPermission() {if (ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);}else {takePhoto();}}

4. 申请权限的回调。

    /*** 用户选择是否开启权限操作后的回调;TODO 同意/拒绝*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// TODO 用户同意开启权限,打开相机takePhoto();}else{Log.d("HL", "权限申请拒绝!");}}}

5. 创建一个存放拍的照片的文件

    /*** 创建一个存放拍的照片的文件*/private File createImageFile() throws IOException {// Create an image file nameString timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());String imageFileName = "JPEG_" + timeStamp + "_";Log.d("HL", imageFileName);File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);return File.createTempFile(imageFileName,  /* prefix */".bmp",         /* suffix */storageDir      /* directory */);}

6. 打开相机。

    /*** 打开相机,选择头像*/private void takePhoto() {Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 确保有一个活动来处理意图if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {// 创建保存图片的文件夹File imageFile = null;try {imageFile = createImageFile();}catch (Exception e){e.printStackTrace();}if (imageFile != null) {//TODO imageUri 用来接收拍摄的这张照片的真实路径imageUri = FileProvider.getUriForFile(this, "com.example.takePhoto.fileprovider", imageFile);}takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST_CODE);}}

7. 结果回调。用户拍了一张图片,接收返回的结果并在ImageView里显示。

 @Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == TAKE_PHOTO_REQUEST_CODE) {if (resultCode == Activity.RESULT_OK) {try {InputStream inputStream = getContentResolver().openInputStream(imageUri);Bitmap bitmap = BitmapFactory.decodeStream(inputStream);mImg.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}}}

8.注册内容提供者(Provider)。在 AndroidManifest.xml注册。

其中,android:name属性值是固定的,android:authorities 属性的值必须要和上面takePhoto()方法里的FileProvider.getUriForFile() 方法中的第二个参数一致,并且该参数固定为"包名(com.xxx.xxx).fileprovider"。另外,这里还有<provider>标签的内部使用<meta-data>来指定Uri的共享路径,并引入一个 @xml/file_paths资源。

在 res -> xml 下创建一个File为“ file_paths”文件,添加以下内容

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="image_path" path="/" />
</paths>

其中,external-path 就是用来指定 Uri 共享的,name 属性可以随便填写,path 属性的值表示共享的具体路径。

ManiActivity.java 完整代码

package com.example.takephoto;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;public class MainActivity extends AppCompatActivity {private static final int PERMISSION_REQUEST_CODE = 0;private static final int TAKE_PHOTO_REQUEST_CODE = 0;private Uri imageUri;private ImageView mImg;private Button mTakePhoto;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImg = findViewById(R.id.img);mTakePhoto = findViewById(R.id.btn_take_photo);mTakePhoto.setOnClickListener(v -> {requestPermission();});}/*** 申请动态权限*/private void requestPermission() {if (ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);}else {takePhoto();}}/*** 用户选择是否开启权限操作后的回调;TODO 同意/拒绝*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// TODO 用户同意开启权限,打开相机takePhoto();}else{Log.d("HL", "权限申请拒绝!");}}}/*** 打开相机,选择头像*/private void takePhoto() {Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 确保有一个活动来处理意图if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {// 创建保存图片的文件夹File imageFile = null;try {imageFile = createImageFile();}catch (Exception e){e.printStackTrace();}if (imageFile != null) {//TODO imageUri 用来接收拍摄的这张照片的真实路径imageUri = FileProvider.getUriForFile(this, "com.example.takePhoto.fileprovider", imageFile);}takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST_CODE);}}/*** 创建一个存放拍的照片的文件*/private File createImageFile() throws IOException {// Create an image file nameString timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());String imageFileName = "JPEG_" + timeStamp + "_";Log.d("HL", imageFileName);File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);return File.createTempFile(imageFileName,  /* prefix */".bmp",         /* suffix */storageDir      /* directory */);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == TAKE_PHOTO_REQUEST_CODE) {if (resultCode == Activity.RESULT_OK) {try {InputStream inputStream = getContentResolver().openInputStream(imageUri);Bitmap bitmap = BitmapFactory.decodeStream(inputStream);mImg.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}}}
}

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

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

相关文章

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例

Qt5开发及实例V2.0-第十八章-Qt-MyselfQQ实例 第18章-Qt MyselfQQ18.1 概述18.2 、发送文件18.3 、接收文件18.4 、保证传输的安全和稳定18.5 、总结 本章相关例程源码下载1.Qt5开发及实例_CH1801.rar 下载 第18章-Qt MyselfQQ 18.1 概述 MyselfQQ是一个基于Qt5框架开发的轻量…

Helm 的简单使用 wordpress install

概述 尝试使用Helm部署wordpress博客服务 Helm | Helm Helm命令 bash自动补全 Helm | Helm补全 - bash wordpress案例 install helm repo add bitnami https://charts.bitnami.com/bitnamihelm install wordpress bitnami/wordpress \ --namespacewordpress \ --create-…

使用ElementUI完成登入注册的跨域请求,结合vue-cli搭建的SPA项目,减少冗余代码提升开发效率

目录 一、跨域的概述 ( 1 ) 讲述 ( 2 ) 特点 如何跨域: 二、ElementUI ( 1 ) 导入 ( 2 ) 搭建 ( 3 ) 页面 三、数据交互 ( 1 ) 安装相关模块 安装模块 引用模块 ( 2 ) axios的get请求 ( 3 ) axios的post请求 四、注册功能 带来的收获 一、跨域的概述 …

数据结构与算法-时间复杂度与空间复杂度

数据结构与算法 &#x1f388;1.概论&#x1f52d;1.1什么是数据结构&#xff1f;&#x1f52d;1.2什么是算法&#xff1f; &#x1f388;2.算法效率&#x1f52d;2.1如何衡量一个算法的好坏&#xff1f;&#x1f52d;2.2算法的复杂度&#x1f52d;2.3时间复杂度&#x1f4d6;2…

【C#】Redis在net core下使用教程

系列文章 文章目录 系列文章前言一、Redis 简介1.1 Redis 优势1.2 Redis与其他key-value存储有什么不同&#xff1f; 二、Redis安装步骤2.1 下载链接2.2 安装测试 三、Redis修改帐户密码四、Redis写成Windows服务五、.net core - 使用CSRedisCore操作redis 前言 官方教程&…

若依微服务如何处理Long类型精度丢失问题?

当字段实体类为Long类型且值超过前端js显示的长度范围时会导致前端回显错误。 目录 1、ruoyi-common-security模块添加JacksonConfig配置全局序列化 2、增加指定配置类信息

Java核心知识点整理大全5-笔记

书接上回Java核心知识点整理大全4-笔记_希斯奎的博客-CSDN博客 目录 3.4.1. HashMap&#xff08;数组链表红黑树&#xff09; 3.4.1.1. JAVA7 实现 3.4.1.2. JAVA8 实现 3.4.2. ConcurrentHashMap 3.4.2.1. Segment 段 3.4.2.2. 线程安全&#xff08;Segment 继承 ReentrantLo…

20230924清远博物馆和图书馆

为了漂流来清远&#xff0c;但是一个城市&#xff0c;想快速了解她的年龄&#xff0c;不就得去博物馆图书馆吗&#xff0c;云想衣裳花想容&#xff0c;春风拂槛露华浓。若非群玉山头见&#xff0c;会向瑶台月下逢。 学校她也曾因历史而不断迁移。 清远她呀&#xff0c;原来已…

C# Onnx Yolov8 Detect 水果识别

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

Observability:使用 OpenTelemetry 自动检测 Java 应用程序

作者&#xff1a;David Hope 在快节奏的软件开发领域&#xff0c;特别是在云原生领域&#xff0c;DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付&#xff0c;而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…

【 Tkinter界面-练习05】 event和bind

一、说明 事件和动作有关&#xff1b;所有的界面都与运动有关&#xff0c;本篇将对事件、事件触发、绑定回调函数等&#xff0c;其实是一系列部件配合的复杂的过程&#xff0c;这些过程牵扯到系统如何设计&#xff0c;线程、消息队列循环等。本篇将详细介绍各种因素的关系。 二…

flask_apscheduler实现定时推送飞书消息

需求场景&#xff1a; 实现一个flask服务&#xff0c;通过接口控制一个定时任务任务&#xff08;对酒店订房情况进行检查&#xff09;的开启和停止。要求定时任务完成后&#xff0c;可以通过飞书机器人推送任务完成的消息。 展现效果&#xff1a; 启动定时任务 关闭定时任务…

vue项目打包优化

首先第一步通过浏览器看首次加载的问题大小&#xff0c;时间跨度等方面入手 1. Coverage观察 Coverage是chrome开发者工具的一个新功能&#xff0c;从字面意思上可以知道它是可以用来检测代码在网站运行时有哪些js和css是已经在运行&#xff0c;而哪些js和css是还没有用到的&a…

【刷题】2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法&#xff0c;x y2 − z2&#xff08;yz)(y-z) 即xa*b&#xff0c;ayz&#xff0c;by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是&#xff08;r-l&#xff09;*x&am…

【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数

1004. 最大连续1的个数 III 1004. 最大连续1的个数 III 题目描述&#xff1a; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 解题思路&#xff1a; 首先题目要我们求出的最多翻转k个0后&#x…

2023华为杯数模C题——大规模创新类竞赛评审方案研究

B题——大规模创新类竞赛评审方案研究 思路&#xff1a;采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…

Android ANR日志分析

会造成ANR的场景&#xff1a; Service Timeout&#xff1a;前台服务在20s内未执行完成&#xff0c;后台为200s&#xff1b; BroadcastQueue Timeout&#xff1a;前台广播在10s内未执行完成&#xff0c;后台为60s&#xff1b; ContentProvider Timeout&#xff1a;内容提供者在…

SAP Oracle表空间扩展技术手册

1、DBACOCKPIT下查看表空间 当表空间不足(达到99%)时,需要按以下步骤扩充表空间(每次扩充20000M,20G): (也可以通过DB13,DB02查看表空间) 新浪博客 Tablespace PSAPSR3 is 100% used | SAP Community Oracle是通过增加数据文件的方式来为表空间扩容。为指定表空间增…

BST搜索二叉树

目录 二叉搜索树概念 ​编辑 1 二叉搜索树的构建 2. 二叉搜索树的删除 3二叉搜索树中放入元素 4. 二叉搜索树中元素的删除 5. 二叉搜索树中元素的遍历 6 二叉搜索树中元素的查找 7二叉搜索树的拷贝构造 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一…

WeCanStudio工具套件介绍

直接上视频,在超燃的《天马座幻想》的背景音乐下&#xff0c;再次了解一下该工具套件吧。 WeCanStudio开发套件介绍