android7.0 拍照以及图片剪辑--(再次修改)
如果你是在fragment里头调用的拍照,出了bug 可以查看 这篇文章 点我 不懂的可以留言。
这篇博客对于7.0的版本的修改。主要是在文件存储的处理。
6.0、8.0版本使用本文的存储文件会出现 java.io.FileNotFoundException: No such file or directory 找不到文件夹
至于怎么做版本适配大家可以度娘一下,我这个问题往后我处理好放在博客给大家看看还有什么不足的,还请指点。
本次修改的地方是使用了第三方的截图开源框架 uCrop,解决了一些机型剪辑图片时gg了。原因一个就是,Android自带的截图有点坑啊(应该是我用不好的原因)毕竟别人的框架也是基于系统的所提供嘛。
这边先说明一下uCrop的使用,再往下看就是拍照功能的实现
1、添加依赖走起 -->app.gradle
implementation 'com.yalantis:ucrop:1.4.1'
-->build.gradle (Project)
allprojects {repositories {google()jcenter()maven { url "https://jitpack.io" } //添加的是这句} }
2、申请activity,这个并不是说你自己去创建一个,你看清楚他的包名,uCrop是作者的喔。
<activity android:name="com.yalantis.ucrop.UCropActivity" android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
3、开搞啦。这里直接使用代码就可以,截图跳转到UCropActivity
UCrop uCrop = UCrop.of(uri, cropUri); //第一参数是处理图片你的文件的路径,第二个参数就是存放剪辑后的路径 UCrop.Options options = new UCrop.Options(); //设置裁剪图片可操作的手势 options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL); //是否隐藏底部容器,默认显示 options.setHideBottomControls(true); //设置toolbar颜色 options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); //设置状态栏颜色 options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); // //是否能调整裁剪框 // options.setShowCropFrame(true); options.setCompressionFormat(Bitmap.CompressFormat.JPEG); //UCrop配置 //设置裁剪图片的宽高比,比如1:1 你自己随意 uCrop.withAspectRatio(1, 1); uCrop.withMaxResultSize(250,250); uCrop.withOptions(options); //uCrop.useSourceImageAspectRatio(); //跳转裁剪页面 uCrop.start(getContext(),this,CODE_RESULT_REQUEST); //start 方法中提供几种方式 也就是说你在fragment、activity 都可以使用,其中fragment也做了一个适配 你在fragment中调用也没有问题的。 参数使用的话,点击去看一下源码就知道怎么用了。
4、看下uCrop的效果
旋转
5、截图后的显示
然后进入我们的主题。
//拍照 private void showCamera() {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, REQUEST_CAMERA); }
//保存图片路径 private void saveUrl() {file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/test/" + System.currentTimeMillis() + ".jpg"); file.getParentFile().mkdirs(); uri = FileProvider.getUriForFile(this, "com.example.cnb.cemera.fileprovider", file); }
//权限申请以及开启 下面有一段新的权限申请,至于版本适配大家还是得自己去写 public void applyWritePermission() {String[] permissions = {android.Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (Build.VERSION.SDK_INT >= 23) {int check = ContextCompat.checkSelfPermission(this, permissions[0]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (check == PackageManager.PERMISSION_GRANTED) {//调用相机 showPhoto(); } else {requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); }} else {showPhoto(); } }
//这一段新的权限申请/** /** * * @param selectFun 请求码,对应的功能,拍照 || 图库选取 */ public void applyWriteAndReadPermission(int selectFun) {if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//如果灭有权限 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, selectFun); //requestCode } else {showPhoto(); } }
//权限返回 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {showPhoto(); } else {// 没有获取 到权限,从新请求,或者关闭app Toast.makeText(this, "需要存储权限", Toast.LENGTH_SHORT).show(); } }
//activity返回 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) {Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(file); mediaScanIntent.setData(contentUri); sendBroadcast(mediaScanIntent); String path = this.getExternalCacheDir().getPath(); cropRawPhoto(uri); } else if (requestCode == CODE_RESULT_REQUEST) {//在手机相册中显示刚拍摄的图片 if (data == null) {return; }Bundle extras = data.getExtras(); if (extras != null) {bm = extras.getParcelable("data"); } // sendImage(bm); img.setImageBitmap(bm); }}
//裁剪图片 使用第三方框架uCrop 进行编辑, public void cropRawPhoto(Uri uri) { //这个uri是拍照后保存下来的图片文件路径Log.e("url", uri + "-------"); File cropFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/test/crop_" + System.currentTimeMillis() + ".jpg"); cropFile.getParentFile().mkdirs(); Uri cropUri = FileProvider.getUriForFile(getContext(), "com.example.cnb.superschool.fileprovider", cropFile); UCrop uCrop = UCrop.of(uri, cropUri); UCrop.Options options = new UCrop.Options(); //设置裁剪图片可操作的手势 options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL); //是否隐藏底部容器,默认显示 options.setHideBottomControls(true); //设置toolbar颜色 options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); //设置状态栏颜色 options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); // //是否能调整裁剪框 // options.setShowCropFrame(true); options.setCompressionFormat(Bitmap.CompressFormat.JPEG); //UCrop配置 //设置裁剪图片的宽高比,比如1:1 你自己随意 uCrop.withAspectRatio(1, 1); uCrop.withMaxResultSize(250, 250); uCrop.withOptions(options); //uCrop.useSourceImageAspectRatio(); //跳转裁剪页面 uCrop.start(getContext(), this, CODE_RESULT_REQUEST); }
//裁剪图片 系统自带的图片剪辑 public void cropRawPhoto(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("return-data", true); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); startActivityForResult(intent, CODE_RESULT_REQUEST); }
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.cnb.cemera.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths"/> </provider>
<?xml version="1.0" encoding="utf-8"?> <resources>
<external-path name="external_files" path="." />
</resources>
复制以上的代码一般就可以运行了啦。
捋一捋处理思路
首先android6.0 以上 都需要 权限申请,
如果权限已经开启,那么执行拍照功能。否则判断用户是否要开启该权限
开启/关闭 权限都后会有一个权限返回结果,那么,返回中去判断权限是否开启,开启则进行拍照
接着,拍照功能开启,确定后保存图片路径,返回到onActivityResult 根据requestCode 来判定
是哪一个功能的返回,在判断为拍照功能里头添加剪辑。
最后轮到剪辑功能,跳转到剪辑页面,需要的设置他们的参数,也就是截取的比例,完成后返回到onActivityResult
判断是不是剪辑功能的返回值,设置图片显示。
这个图片显示需要转换成bitmap,获取data之后转成bitmap
Bundle extras = data.getExtras(); if (extras != null) { bm = extras.getParcelable("data"); }
img.setImageBitmap(bm)
android7.0以后 需要通过获取路径来获取图片。
新建一个xml文件夹,然后新建一个xml文件,名字随意。可以返回上面代码看一下
android7.0 拍照以及图片剪辑--(再次修改)相关推荐
- android 做分享到朋友圈,android7.0实现分享图片到朋友圈功能
android7.0实现分享图片到朋友圈功能 发布时间:2020-08-29 00:46:50 来源:脚本之家 阅读:132 作者:十个雨点 本文实例为大家分享了android实现分享图片到朋友圈功能 ...
- Android之本地相册图片选取和拍照以及图片剪辑
转载请注明出处:http://blog.csdn.net/loveyaozu/article/details/51160482 相信有很多Android开发人员在日常开发中,由于项目需求,需要我们的A ...
- Android7.0 拍照 选择照片 权限 实现
参考链接: http://blog.csdn.net/hu5080126/article/details/53738625 http://www.jianshu.com/p/ba57444a7e69 ...
- android7 sd fix,Android7.0拍照失败FileUriExposedException,你的拍照代码升级了吗
背景: SamSung SM-N9006 Android5.0在应用中拍照之后,无法获取拍照之后的数据,报错FileUriExposedException 思路: 参考官方文档对该错误的解释,是由于出 ...
- Android7.0相机图册图片剪切封装 - ucrop框架
说明: * 两天使用 ucrop框架 实现了从相册和图册选择图片,然后剪切返回显示的功能.同时兼容了相机拍照7.0. * 对相机调用.相册调用.图片剪切封装成了工具类. * 剪切图片框架ucrop我也 ...
- android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...
这里主要是基于Android 7.0,Nougat 实现一个获取相机拍照的图片后,使用FileProvider把图片转换为实际的路径. 首先需要在AndroidManifest.xml声明调用相机的权 ...
- android 7.0原生动态,Android7.0适配教程,心得
Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的挑战,这几天我将应用适配到Android7.0,其中也遇到了不少问题也踩了一些坑,在这 ...
- Android打开相册vs拍照获取图片的原理实现
前言:这几天在做用户登陆注册的逻辑时,遇到了要修改用户的头像问题的解决.在此把实现的原理以及实现过程中遇到的问题分享个大家...留下些许脚印 在手机的app里我们常常可用看到在个人中心页面有修改头像的 ...
- Android7.0以上如何获取头像(拍照或者从相册中选择)
大概的流程 动态权限管理 创建布局文件,这里不多说了 拍照的实现 2.1创建存放图片的文件夹 2.2将文件夹路径转换为uri 2.3隐式启动相机的Activity,uri作为intent的一个参数. ...
最新文章
- 云计算之路-阿里云上:RDS用户的烦恼
- Microsoft SQL Server 查询表中有重复列值的数据 (PARENTGOODSID列值重复的行)?
- ToolBarManager可任意选择你想要的菜单
- 详解随机神经网络结构搜索 (SNAS)
- Java 动态代理介绍及用法
- 自定义注解 实现自定义消息_实现自定义的未来
- Apple Swift编程语言新手教程
- SQL Server 使用Detach和Attach 方式 移动数据库位置
- 华为非对等通信小实验
- Find n‘th number in a number system with only 3 and 4
- Queue--队列(c语言简单实现)
- 依据BaiduHack多线程爬取攻击点url和网站url,保存至txt
- 简单的TCP回射服务
- 苹果Mac怎样切换大写输入法?
- Nifi 数据流整合工具
- 创业的几条至理名言,每条对创业者都大有帮助,值得收藏!
- laravel从入门到精通之 php excel设置单元格边框只显示竖条
- U盘制作ubuntu18.04.6系统安装盘
- zabbix-邮件报警配置
- Linux(1) 概要、安装 、文件系统基本认知
热门文章
- 原来吃香蕉有这么多好处
- 认识微型计算机常见i o接口教案,微型计算机由( )、( ) 、 I/O 接口以及连接他们的总线组成。...
- 用c语言设计个人所得税的程序,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
- js语音播报功能(1)
- 仿真3. 仿真系统的设计思路
- 总结:动态规划(1) 基础题型,动规五部曲
- VMware 虚拟机硬盘扩容
- Eclipse 21 款插件介绍
- The specified key byte array is 136 bits which is not secure enough for any JWT HMAC-SHA algorithm.
- IIS专家蜘蛛监控系统