Android调用系统的拍照,打开相册功能
Android调用系统的拍照,打开相册功能
1 添加权限:
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.
WRITE_EXTERNAL_STORAGE" />
<!--请求访问使用照相设备-->
<uses-permission android:name="android.permission.CAMERA" />
2 设置标志(回传码)
// 拍照回传码
public final static int CAMERA_REQUEST_CODE = 0;// 相册选择回传吗public final static int GALLERY_REQUEST_CODE = 1;
若多个地方使用了这个拍照功能 可以放在公共类中,设置为全局变量
3 在相应的java类中:
// 拍照的照片的存储位置private String mTempPhotoPath;// 照片所在的Uri地址private Uri imageUri;
4 点击拍照事件中:
动态申请权限:
//第二个参数是需要申请的权限if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { //权限还没有授予,需要在这里写申请权限的代码// 第二个参数是一个字符串数组,里面是你需要申请的权限 可以设置申请多个权限// 最后一个参数是标志你这次申请的权限,该常量在onRequestPermissionsResult中使用到ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},GlobalVariable.CAMERA_REQUEST_CODE);}else { //权限已经被授予,在这里直接写要执行的相应方法即可takePhoto();}
5 拍照实现方法
private void takePhoto(){// 跳转到系统的拍照界面Intent intentToTakePhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 指定照片存储位置为sd卡本目录下// 这里设置为固定名字 这样就只会只有一张temp图 如果要所有中间图片都保存可以通过时间或者加其他东西设置图片的名称// File.separator为系统自带的分隔符 是一个固定的常量mTempPhotoPath = Environment.getExternalStorageDirectory() + File.separator + "photo.jpeg";// 获取图片所在位置的Uri路径 *****这里为什么这么做参考问题2***** /*imageUri = Uri.fromFile(new File(mTempPhotoPath));*/imageUri = FileProvider.getUriForFile(MainActivity.this,MainActivity.this.getApplicationContext().getPackageName() +".my.provider",new File(mTempPhotoPath));//下面这句指定调用相机拍照后的照片存储的路径intentToTakePhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intentToTakePhoto, GlobalVariable.CAMERA_REQUEST_CODE);}
6 打开本地相册事件中:
动态获取权限:
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { //权限还没有授予,需要在这里写申请权限的代码// 第二个参数是一个字符串数组,里面是你需要申请的权限 可以设置申请多个权限// 最后一个参数是标志你这次申请的权限,该常量在onRequestPermissionsResult中使用到ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},GlobalVariable.CAMERA_REQUEST_CODE);}else { //权限已经被授予,在这里直接写要执行的相应方法即可choosePhoto();}
7 打开相册方法实现
private void choosePhoto(){Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);// 如果限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" 所有类型则写 "image/*"intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/jpeg");startActivityForResult(intentToPickPic, GlobalVariable.GALLERY_REQUEST_CODE);}
8 界面回调方法 用于将得到的照片处理
//当拍摄照片完成时会回调到onActivityResult 在这里处理照片的裁剪@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {fragment4ImageView0 = findViewById(R.id.fragment4ImageView0);if (resultCode == MainActivity.RESULT_OK) {switch (requestCode) {case GlobalVariable.CAMERA_REQUEST_CODE: {// 获得图片try {//该uri就是照片文件夹对应的uriBitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));// 给相应的ImageView设置图片 未裁剪fragment4ImageView0.setImageBitmap(bit);} catch (Exception e) {e.printStackTrace();}break;}case GlobalVariable.GALLERY_REQUEST_CODE: {// 获取图片try {//该uri是上一个Activity返回的imageUri = data.getData();if(imageUri!=null) {Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));Log.i("bit", String.valueOf(bit));fragment4ImageView0.setImageBitmap(bit);}} catch (Exception e) {e.printStackTrace();}break;}}}super.onActivityResult(requestCode, resultCode, data);}
这里直接将得到的照片放在ImageView上 要裁剪,参考:
http://blog.csdn.net/weixin_37577039/article/details/79186862
9 权限申请回调方法
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){if (requestCode == GlobalVariable.CAMERA_REQUEST_CODE){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){takePhoto();} else{// Permission DeniedToast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();}}if (requestCode == GlobalVariable.GALLERY_REQUEST_CODE){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){choosePhoto();} else{// Permission DeniedToast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}
问题一:
Attempt to invoke virtual method ‘void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)’ on a null object reference
原
Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
fragment4ImageView0.setImageBitmap(bit);
解决:
先检查右边,是否为空的
还是不行 检查左边 是否有findViewById
如果是在onActivityResult中设置的setImage 即使在onCreate中findView 了也是不行的 要在onActivityResult中findView
问题2:
拍照 Android N 版本遇到的问题:
android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri()
解决:
用 FileProvider去打开目录
1 创建一个类 继承FileProvider
public class GenericFileProvider extends FileProvider {}
2 Manifest.xml的application中:
添加:
<provider
android:name=".Utils.GenericFileProvider"android:authorities="${applicationId}.my.provider"android:exported="false"android:grantUriPermissions="true"><meta-data
android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider>
3 res/xml目录下 若没有 xml目录则创建
创建 provider_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path name="external_files" path="."/>
</paths>
4 使用:
将
/*imageUri = Uri.fromFile(new File(mTempPhotoPath));*/
替换成:
imageUri = FileProvider.getUriForFile(MainActivity.this,MainActivity.this.getApplicationContext().getPackageName() +".my.provider",new File(mTempPhotoPath));
静默升降摄像头问题 若使用了下面的代码 则可能会导致手机升降摄像头 这样会让用户觉得你私自调用了摄像头 泄漏了他的隐私 要注意~
1.摄像头调用:用户没有拍照操作,但app调用到Camera1.open()时,会静默升降摄像头;
2.麦克风调用:用户没有录音操作,但app在后台调用AudioRecord时,会让系统认为是在录音,状态栏就有红色录音提示
麦克风录音提示图:
Android调用系统的拍照,打开相册功能相关推荐
- Android 调用系统照相机拍照和录像
Android 调用系统照相机拍照和录像 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.and ...
- Android调用系统相机拍照并保存到指定位置
Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto)void onclick() {Intent intent = new Intent(MediaSt ...
- android固定位置拍照,Android调用系统相机拍照并保存到指定位置
Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto) void onclick() { Intent intent = new Intent(Media ...
- android 调用系统相机拍照 获取原图
博客源址:android 调用系统相机拍照 获取原图 博客时间:2013-04-23 11:08 好吧,为了这个问题又折腾了一整天.之前在网上找来的方法,如果在onActivityResult中直接用 ...
- Android调用系统相机拍照
参考: Taking Photos Simply FileProvider 项目地址(好多人找我要,我传到百度云啦,大家自取):链接:https://pan.baidu.com/s/1nWsoE0eS ...
- Android调用系统摄像头拍照并显示在ImageView上
简介 现在市面上的apk只要涉及用户中心都会有头像,而且这个头像也是可自定义的,有的会采取读取相册选择其中一张作为需求照片,另一种就是调用系统摄像头拍照并获取即时照片,本博文就是讲述如何调用摄像头拍照 ...
- 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。...
1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...
- android调用系统照相机拍照,并压缩保存在本地
1.首先拍照和保存文件肯定就需要申请权限 <!-- 往SDCard写入数据权限 --><uses-permission android:name="android.perm ...
- android相机保存文件为空,android 调用系统相机拍照,返回的data为null
最近做项目,需要拍照功能,于是就想简单的调用系统相机来完成这一需求(当然,如果想要个性化一点的,也可以自定义camera去实现,这里暂时不做). if(Environment.getExternalS ...
最新文章
- AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python)
- sql删除重复的数据保留一条_leetcode题库-sql练习精讲系列--九、删除重复
- Class Activation Mapping (CNN可视化) Python示例
- wxWidgets:wxValidator概述
- P4819-[中山市选]杀人游戏【tarjan】
- BZOJ3771 Triple(FFT+容斥原理)
- MIPCache 域名升级
- Leetcode算法题(C语言)7--两个数组的交集 II
- 遭做空后又被律所调查 贾跃亭的FF上市不到3个月股价已近腰斩
- led灯光衰怎么解决_花小钱办大事 主流直插式LED大灯横评
- IE9 以下版本浏览器兼容HTML5的方法,使用的静态资源的html5shiv包:
- .so动态链接库文件
- 使用 Xshell 连接矩池云 GPU服务器
- HDU-1069 Monkey and Banana 动态规划
- 优秀的CSS框架---bootstrap
- 在线免费下载音乐网站源码,支持在线播放
- el tree 双击事件
- HTML: 网页摇奖机(抽号机)
- Staged Event Driven Architecture (SEDA) 介绍
- 信创办公--基于WPS的Word最佳实践系列(快速统一文档格式)
热门文章
- 蓝桥杯真题 16省Ja3-搭积木(小明最近喜欢搭数字积木, 一共有10块积木,每个积木上有一个数字,0~9。...)搭积木规则: 每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。 最
- 应用安全系列之二十七:加密算法
- 情人节来了,要不要去当舔狗
- 浅谈 TWAIN 标准
- 误删windows启动分区的修复方法
- 漫画算法:什么是 B 树?
- css collapsing margins问题
- Echarts模板(二):簇状柱形图
- 高校学籍管理系统【数据库设计】2020.7.26
- A. Serval and Mocha‘s Array codeforces 1789A