Android 调用设备已有的相机应用详情
作者:发疯红花油 发布时间:2022-12-20 01:07:21
如果我们只是需要让用户能够拍摄照片,则可以直接请求已有相机应用拍摄照片并将照片返回给我们
1、拍照
1.1 请求相机功能
在清单文件中添加:
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
如果您的应用使用相机,但不需要相机也可以正常运作,应将 android:required
设为 false
。这样,Google Play
便会允许未装有相机的设备下载您的应用。
1.2 调用相机应用拍照获得缩略图
static final int REQUEST_IMAGE_CAPTURE = 1;
//调用相机应用拍照
private void takePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
1.3 调用相机应用拍照获得完整图片
//调用相机应用拍照获得完整图片
private void takePictureGetFile() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
}
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
this.getPackageName()+".fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQ_2);
}
}
}
1.4 相机应用返回缩略图,完整图片
Android
相机应用会对返回 Intent
(作为 extra 中的小型 Bitmap 传递给 onActivityResult(),使用键 "data")中的照片进行编码。
下面的代码会检索此图片,并将其显示在一个 ImageView 中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//获得缩略图
if (requestCode == REQ_1 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
ivThumbnail.setImageBitmap(imageBitmap);
}
//获得完整图片
if (requestCode == REQ_2) {
FileInputStream fis = null;
try {
fis = new FileInputStream(currentPhotoPath);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
ivComplete.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//观看视频
if (requestCode == REQ_3 && resultCode == RESULT_OK) {
Uri videoUri = data.getData();
vvVideo.setMediaController(new MediaController(this));
vvVideo.setVideoURI(videoUri);
vvVideo.start();
}
}
2、保存文件的配置
拥有写入权限即暗示可以读取,所以只需要请求写入权限
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
注意:
getUriForFile
(Context, String, File),会返回 content:// URI。对于以 Android 7.0(API 级别 24)及更高版本为目标平台的最新应用,跨越软件包边界传递 file:// URI 会导致出现 FileUriExposedException。因此,一种更通用的方法来使用FileProvider
存储图片。
在清单文件中添加提供器:
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</application>
确保授权字符串与 getUriForFile
(Context, String, File) 的第二个参数匹配。 新建文件res/xml/file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>
路径组件对应于 getExternalFilesDir()
返回的路径(在调用 Environment.DIRECTORY_PICTURES 时)。请务必将 com.example.package.name
替换为应用的实际软件包名称。
3、录制视频
3.1 调用相机应用录制视频
//调用相机应用录制视频
private void takeVideo() {
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {//如果是null,应用会崩溃
File videoFile = null;
try {
videoFile = createVideoFile();
} catch (IOException ex) {
ex.printStackTrace();
}
if (videoFile != null) {
Uri videoURI = FileProvider.getUriForFile(this,
this.getPackageName()+".fileprovider",
videoFile);
takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoURI);
startActivityForResult(takeVideoIntent, REQ_3);
}
}
}
3.2 相机应用返回视频
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//观看视频
if (requestCode == REQ_3 && resultCode == RESULT_OK) {
Uri videoUri = data.getData();
vvVideo.setMediaController(new MediaController(this));
vvVideo.setVideoURI(videoUri);
vvVideo.start();
}
}
来源:https://juejin.cn/post/7022891422303043592


猜你喜欢
- 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。一、相关约定为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定
- android通过toast实现悬浮通知效果,如图:实现的功能: 自定义悬浮弹窗;点击其他地方该布局不受影响;可自定义显示时间;可
- 使用要点如下:1.利用ListAdapter(一般使用ArrayAdapter)为AutoCompleteTextView提供数据,若有需要
- 本文实例为大家分享了C#实现上传下载图片的具体代码,供大家参考,具体内容如下1.首先我们通过流来上传下载图片,所有操作只停留在流这一层Mem
- 原因用Java调用雪球的API,结果返回的是乱码,一番研究后发现是因为返回的数据使用了GZIP压缩,需要先解压才能得到正确数据。思路使用了G
- Android 应用启动欢迎界面广告0.写在前面在这篇教程中来实现一个类似于微信的的延迟3秒再进入主界面的效果。1.项目准备先新建一个空的a
- 前言:线程的生命周期指的是线程从创建到销毁的整个过程,通常情况下线程的生命周期有以下 5 种:初始状态可运行状态运行状态休眠状态终止状态它们
- 基本要点1、定义根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式2、传统方式与Restful风格的区别在我们学习re
- 字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位。 坏处是计算
- Java try和catch的使用尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常。这样做有两个好
- 问题描述问题原因出现该问题的原因是项目Project当中的jdk与电脑当中的jdk版本不一致造成的。解决方法1、查看本机的jdk版本:命令提
- 本文实例为大家分享了Android实现录音静音降噪的具体代码,供大家参考,具体内容如下需求:客户反馈产品的录音里面很多杂音(因为我们把Cod
- 在spring boot中,简单几步,使用spring AOP实现一个 * :1、引入依赖:<dependency> &nbs
- 试题描述:一个球场C的球迷看台可容纳M*N个球迷。官方想统计一共有多少球迷群体,最大的球迷群体有多少人。球迷选座特性:同球迷群体会选择相邻座
- 页面:上传文件时的关键词:enctype="multipart/form-data"<%@ page langua
- 一、什么是JWTJSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案。现在的项目开发一般都是前端端分离,这就涉及到
- 本文实例讲述了Java集合定义与用法。分享给大家供大家参考,具体如下:java集合大体可分为三类,分别是Set、List和Map,它们都继承
- 一、万能的字符串当然,任何时候都可以使用字符串作为属性的值,从配置文件里读取出来,如下:配置文件内容为:pkslow.admin=larry
- Spring Security简介:Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块
- Java Resource路径首先一点很重要,Java中不存在标准的相对路径,各种相对路径取资源的方式都是基于某种规则转化为绝