Android 7.0+相机、相册、裁剪适配问题

在manifest中:

  1. <provider
  2. android:name="android.support.v4.content.FileProvider"
  3. android:authorities="com.***.***.fileprovider"
  4. android:exported="false"
  5. android:grantUriPermissions="true">
  6. <meta-data
  7. android:name="android.support.FILE_PROVIDER_PATHS"
  8. android:resource="@xml/file_paths" />
  9. </provider>
  1. 1android:authorities:可以随便取,在之后的代码需要一一对应:
    2android:resource:创建一个xml文件夹,xml文件夹下创建file_paths资源文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources xmlns:android="http://schemas.android.com/apk/res/android">
  3. <paths>
  4. <external-path path="" name="camera_photos" />
  5. <files-path path="" name="photos" />
  6. </paths>
  7. </resources >

代码中:

  1. private String mPhotoPath;
  2. private Bitmap mBitmap;
  3. private File mAvatarFile;
  4. private File fileUri;
  1. /**
  2. * 调用手机相机
  3. */
  4. private void getImageFromPhoto() {
  5. File file = new File(Constants.APP_PATH);
  6. if (!file.exists()) {
  7. file.mkdirs();
  8. }
  9. mPhotoPath = Constants.APP_PATH + String.valueOf(System.currentTimeMillis()) + ".jpg";
  10. fileUri = new File(mPhotoPath);
  11. Intent intentCamera = new Intent();
  12. Uri imageUri;
  13. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  14. imageUri = FileProvider.getUriForFile(ChangeUserInfoActivity.this, "com.***.***.fileprovider", fileUri);
  15. } else {
  16. imageUri = Uri.fromFile(fileUri);
  17. }
  18. intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
  19. intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  20. startActivityForResult(intentCamera, START_PHOTO_CAMERA_REQUEST);
  21. }
  1. /**
  2. * 调用手机相册
  3. */
  4. private void allPhoto() {
  5. Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  6. startActivityForResult(intent, START_PHOTO_IMAGE_REQUEST);
  7. }
  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if (requestCode == START_PHOTO_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
  5. //调用相册
  6. Cursor cursor = getContentResolver().query(data.getData(), new String[]{MediaStore.Images.Media.DATA}, null, null, null);
  7. //游标移到第一位,即从第一位开始读取
  8. if (cursor != null) {
  9. cursor.moveToFirst();
  10. mPhotoPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
  11. cursor.close();
  12. //调用系统裁剪
  13. mAvatarFile = new File(mPhotoPath);
  14. final Uri uri;
  15. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  16. uri = FileProvider.getUriForFile(this, "com.***.***.fileprovider", mAvatarFile);
  17. } else {
  18. uri = Uri.fromFile(mAvatarFile);
  19. }
  20. startPhoneZoom(uri);
  21. }
  22. }
  23.  
  24. if (requestCode == START_PHOTO_CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
  25. //相机返回结果,调用系统裁剪
  26. mAvatarFile = new File(mPhotoPath);
  27. Uri uri;
  28. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  29. uri = FileProvider.getUriForFile(this, "com.***.***.fileprovider", mAvatarFile);
  30. } else {
  31. uri = Uri.fromFile(mAvatarFile);
  32. }
  33. startPhoneZoom(uri);
  34. }
  35. if (requestCode == START_CROP_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
  36. //设置裁剪返回的位图
  37. Bundle bundle = data.getExtras();
  38. if (bundle != null) {
  39. mBitmap = bundle.getParcelable("data");
  40. SDLogUtil.d(TAG, "--------------bitmap------------" + mBitmap);
  41. }
  42. }
  43. }
  1. /**
  2. * 调用系统裁剪的方法
  3. */
  4. private void startPhoneZoom(Uri uri) {
  5. Intent intent = new Intent("com.android.camera.action.CROP");
  6. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  7. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  8. }
  9. intent.setDataAndType(uri, "image/*");
  10. //是否可裁剪
  11. intent.putExtra("corp", "true");
  12. //裁剪器高宽比
  13. intent.putExtra("aspectY", 1);
  14. intent.putExtra("aspectX", 1);
  15. //设置裁剪框高宽
  16. intent.putExtra("outputX", 150);
  17. intent.putExtra("outputY", 150);
  18. //返回数据
  19. intent.putExtra("return-data", true);
  20. startActivityForResult(intent, START_CROP_IMAGE_REQUEST);
  21. }

Android 7.0+相机、相册、裁剪适配问题的更多相关文章

  1. android 7.0+ FileProvider 访问隐私文件 相册、相机、安装应用的适配

    从 Android 7.0 开始,Android SDK 中的 StrictMode 策略禁止开发人员在应用外部公开 file:// URI.具体表现为,当我们在应用中使用包含 file:// URI ...

  2. Android 7.0 出现 ”FileUriExposedException“ 和 ”解析包出现错误“ 异常的解决办法

    问题1 :android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.xxx.xxx.xxx.rel ...

  3. 【适配整理】Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException

    一.写在前面 最近由于廖子尧忙于自己公司的事情和 OkGo (一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护 ImagePicker(一款支持单.多选.旋转和裁剪的图片选择器),也是处理 ...

  4. Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)

    前段时间写了如何获取相册和拍照之后的照片并且进行显示和上传,这一次是如何进行圆形图像制作,经常看我写的笔记的人会知道,我很懒.那么我就懒的自定义了,目前需求就用原生的就好了,大神的轮子,我会在后面进行 ...

  5. android 照相或从相册获取图片并裁剪

    照相或从相册获取图片并裁剪 在android应用中很多时候都要获取图片(例如获取用户的头像)就需要从用户手机上获取图片.可以直接照,也可以从用户SD卡上获取图片,但获取到的图片未必能达到要求.所以要对 ...

  6. Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException

    一.写在前面 最近由于廖子尧忙于自己公司的事情和OkGo(一款专注于让网络请求更简单的网络框架) ,故让LZ 接替维护ImagePicker(一款支持单.多选.旋转和裁剪的图片选择器),也是处理了诸多 ...

  7. 关于Android 7.0(API24)相机的问题汇总

    在开发Android项目的时候,我们会用到相机,有些时候只是开发一个普通的扫码,仅仅赋予一下 权限 就好了,但是有些时候是需要拍照和从相册中获取照片的.我们在Android 5.0以及5.0之前调用相 ...

  8. Android 8.0系统的应用图标适配

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 参考资料<一起来学习Android 8.0系统的应用图标适配吧>中已经讲得很清楚了,这里我只是简单总结下.详情的内容请阅 ...

  9. Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题

    最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...

随机推荐

  1. BZOJ3534:[SDOI2014]重建(矩阵树定理)

    Description T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回. 幸运 ...

  2. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-1-举例说明

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中 ...

  3. 如何使用seajs+jQuery构建中型项目

    为何有这种想法? 由于最近做的项目是用jquery+seajs集成的,所以就突发奇想 如何使用seajs+jquery能更好的构建项目,比如能解决模块化,模块与模块之间的依赖,文件上线后打包,压缩等能 ...

  4. PAT B1025 反转链表 (25 分)

    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...

  5. openJDK环境搭建编译(fedora)

    1.安装VMware  VMware-workstation-full-10.0.7-2844087.exe    破解码:HY06L-F334P-9Z6H9-6R2XM-23C6J  安装完成之后, ...

  6. js 根据相对路径url获得完整路径url

    自定义方法 GetPath(url) ///根据相对路径得到完整URL ///strUrl:URL相对地址 var GetPath = function (strUrl) { if (strUrl.t ...

  7. Swift与OC代码转换实例

    1. Objectice-C code: NSShadow *shadow = [NSShadow new]; [shadow setShadowColor:[UIColor colorWithRed ...

  8. EZ 2018 04 06 NOIP2018 模拟赛(七)

    我是链接 这次是真的惨,码了将近2hours的可持久化线段树炸掉了! 而且本地拍了一万年也没发现哪里炸了. T1 压位的入门题,话说这道题能拿个99分就可以了(100分要FFT) 对于暴力,就是暴力找 ...

  9. html点击链接打开新窗口

    html标记中格式为<a href="url"> text </a> 此时,内容在原来窗口呈现,如果想新开窗口,可以采用下列方式. 1. <a hre ...

  10. Egret(白鹭引擎)——Egret+fairyGui 实战项目入门

    前言 一行白鹭上青天 需求 最近,我们老板刷刷的为了省事,给美术减压(背景有点长,不说了). 美术出 fairygui,我需要在网页上看到实时操作,并且看到效果! 需求分析 这怕是要了我的狗命啊,但是 ...