Android8.0以上打开相机并裁剪图片
Android7.0以上打开相机的权限更加严格了,有很多博客也是讲这些具体操作的,如果想更深入了解,请自行搜索,这里我只是列出使用的方法,第一行代码第二版的内容,打开相机的权限是基于android7.0,如果完整的按照书上内容写个demo,是可以实现的。这里面我综合了书上的内容,在加上从几篇博客上的总结,写了一个测试的Demo,运行在真机上是没问题(android8.0)。
下面说一下步骤
1、在AndroidManifest.xml文件下的《application》标签中定义一个《provider》内容提供者。
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="你自己的包名"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider>
2、在res文件目录下创建一个xml文件夹,里面生成一个provider_paths.xml文件
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!--"."表示所有路径--><external-path name="名字随便填" path="."/></paths>
3、打开相机`
private void openCamera() {//创建一个保存图片的路径File outputImage = new File(getExternalCacheDir(), "output_image.jpg");try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}//如果android7.0以上的系统,需要做个判断if (Build.VERSION.SDK_INT >= 24) {ImageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.myapplication.provider", outputImage);//7.0} else {ImageUri = Uri.fromFile(outputImage); //7.0以下}//利用隐式Intent 打开系统相机Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);startActivityForResult(intent, TAKE_PHOTO);//这里的TAKE_PHOTO是定义的一个静态常数变量
}
4、由于是startActivityForResult启动的系统相机,所以照完的照片可以用onActivityResult方法接受。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {//截取相机拍照后的图片case TAKE_PHOTO:startPhotoZoom(ImageUri);//这里调用了截取图片的方法break;//返回截取后的结果case RESULT_REQUEST_CODE:if (resultCode == RESULT_OK) {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));imageButton.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;
4.1、截取图片的方法startPhotoZoom
private void startPhotoZoom(Uri uri) {File CropPhoto = new File(getExternalCacheDir(), "Crop.jpg");//这个是创建一个截取后的图片路径和名称。try {if (CropPhoto.exists()) {CropPhoto.delete();}CropPhoto.createNewFile();} catch (IOException e) {e.printStackTrace();}ImageUri = Uri.fromFile(CropPhoto);Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}intent.putExtra("crop", "true");intent.putExtra("scale", true);intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);//输出的宽高intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true); // no face detectionstartActivityForResult(intent, RESULT_REQUEST_CODE);//这里的RESULT_REQUEST_CODE是在startActivityForResult里使用的返回值。}
Android8.0以上打开相机并裁剪图片相关推荐
- 小米部分手机在相册或相机拍照裁剪图片时,出现错误问题
小米部分手机在相册或相机拍照裁剪图片时,出现错误问题 Unable to load resource 0x00000000 from pkg=com.android.systemui 报错型号:Mi ...
- Unity for IOS 加载手机相册图片以及打开相机拍照获取图片
Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...
- Android 7.0 适配 FileProvider相机 相册 裁剪的使用
Android7.0又加了一些新的东西,例如多窗口 通知栏发消息 等等,但是这些是一些功能的改变,可以说是很炫的进步,而我要说的是FileProvider这个杀千刀的Api,先来看一下官方解释: 上面 ...
- cocos creator 调用相机相册裁剪图片并上传到服务器
大致思路就是creator里面js调用Java和object-c代码,调起系统相机相册,选取图库图片/拍照图片进行裁剪,然后转化为base64字符串,最后通过http post请求上传到服务器. Ja ...
- (复习)android 调用系统相机 图库 裁剪-图片上传-客服端-服务器
引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码: package com.cn.lxz. ...
- Android7.0调用系统相机和裁剪
最近将项目的targetSdkVersion升级到了26,发现调用系统相机的时候报了下面这个错误: android.os.FileUriExposedException: file:///storag ...
- android8.0热点打开流程,从Setting到framework
关键函数的调用流程如下: 热点的开启能否成功,主要由以下几个因素影响 (1)WifiStateMachine.java中的状态异常,而引起状态异常的原因有很多,可能是由于我们在修改的过程中,发生了一些 ...
- Android 7.0下拍照和裁剪图片
Android 7.0下拍照和裁剪图片 最近,公司的APP集中爆发了头像上传中拍照或照片裁剪的bug,让我才意识到及时学习Android新特性是多么重要,一个过去式的APP是无法一直满足日益变化的新需 ...
- opencv打开相机实时采集与处理
下面是opencv官方文档中的一个例子, 演示了如何打开相机,获取图片,对图片进行处理 main函数也不需要输入参数,配置好环境直接就可以运行 把处理函数进行修改,就可以实现不同的功能 /* Open ...
最新文章
- Javascript 中的神器——Promise
- 必须认识的http请求包
- java JDBC连接Oracle数据库的方法
- 【UAV】从单个螺旋桨到四旋翼无人机运动学分析
- 使用PHP发送邮件的两种方法
- ASP.NET Core 中的 ORM 之 Dapper
- 【代码收集】提前载入贴图
- 洛谷P3390 【模板】矩阵快速幂
- 集成学习—GBDT原理理解
- linux下tab作用的描述?
- django mysql 登陆界面_django 简单实现登录验证给你 Django用户登录验证跳转问题
- Java工程师两周面试突击-中华石杉-Java面试
- 【MarkDown】基础语法
- Comparator.comparing比较排序
- java sort 降序_详解Java sort()数组排序(升序和降序)
- 物联网 DFrobot 掌控版 人工智能测温实验
- 记一次被“呼死你”电话骚扰的反骚扰经历
- Unity插件之天气系统UniStorm
- c程序设计语言克尼汉,《C程序设计语言(第2版新版)典藏版》 —3.4 switch语句...
- ios android 换手机通讯录备份,用iPhone如何备份/恢复通讯录?