【Android】Android7.0调用相机拍照等问题

转载 2018年04月15日 16:02:41

转自:https://blog.csdn.net/zz110753/article/details/60877594


这位博主十分良心了!!这里我只记录下原理上的问题,具体代码可以到博主的原文仔细看。


在Android6.0中Google提出了动态申请权限的Api,调用相机拍照,访问SDcard等操作都需要先申请对应的权限如下:

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Google是反对放宽私有目录的访问权限的,所以收起对私有文件的访问权限是Android将来发展的趋势。

Android7.0中尝试传递 file:// URI 会触发 FileUriExposedException,因为在Android7.0之后Google认为直接使用本地的根目录即file:// URI是不安全的操作,直接访问会抛出FileUriExposedExCeption异常,这就意味着在Android7.0以前我们访问相机拍照存储时,如果使用URI的方式直接存储剪裁图片就会造成这个异常,那么如何解决这个问题呢?

Google为我们提供了FileProvider类,进行一种特殊的内容提供,FileProvider时ContentProvide的子类,它使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的Uri共享给外部,从而提高了应用的安全性。下面就让我们看一下如何使用这个内容提供者进行数据访问的:

使用FileProvider获取Uri就会将以前的file:// URI准换成content:// URI,实现一种安全的应用间数据访问,内容提供者作为Android的四大组件之一,使用同样需要在清单文件AndroidManifest.xml中进行注册的,注册方法如下:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="包名.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>

provider标签里的 android:name的值是FileProvider的包名+类名为固定值。android:authorities的值相当于一个标志,当我们使用FileProvider的getUriForFile方法时的一个参数需和清单文件注册时的保持一致,这里我使用的是:com.zz.fileprovider可自行定义。exported:要求必须为false,为true则会报安全异常。grantUriPermissions:true,表示授予 URI 临时访问权限。<meta-data />标签里面是用来指定共享的路径。 android:resource="@xml/file_paths"就是我们的共享路径配置的xml文件。关于xml文件的配置如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="camera_photos"
        path="" />
</paths>
external-path标签用来指定Uri共享的,name属性的值可以自定义,path属性的值表示共享的具体位置,设置为空,就表示共享整个SD卡,也可指定对应的SDcard下的文件目录,根据需求自行定义。

Android7.0调用系统相机拍照、访问相册问题。

关于Android7.0调用系统相机拍照、访问相册的一些问题。
  • Zz110753
  • Zz110753
  • 2017-03-08 17:58:13
  • 17690

Android调用系统相机的那些坑

Android实现拍照获取图片,有两种方案,第一就是调用系统相机拍照,然后获取拍照后的图片,实现比较简单,同时功能也比较简单;第二就是自定义相机,实现复杂,但是功能强大。这里讨论的是第一种实现方案。 ...
  • fly_yuge
  • fly_yuge
  • 2016-07-07 15:31:54
  • 3768

android7.0调用相机拍照的问题解决方案

最近在应用中开发调用系统相机拍照的时候,遇到一个问题,就是在安卓7.0及以上机型使用,按照往常写法Uri.fromFile(imgFile)回抛出异常FileUriExposedException导致...
  • BruceeLeee
  • BruceeLeee
  • 2017-08-24 15:41:21
  • 3198

android 调用系统相机拍照的各种异常处理

1 本文只讨论调用系统相机出现的异常解决办法下面是调用系统相机的代码 先看一下最简单的写法 Intent intent = new Intent(android.provider.MediaSto...
  • a56573016613
  • a56573016613
  • 2015-01-19 14:51:35
  • 2268

关于android 7.0调用相机拍照崩溃问题

解决安卓7.0拍照,相册选择崩溃的问题(包括压缩图片在内) 因为项目需要调用相机拍照,自己的测试手机是5.0,按照正常的调用方法直接可以调用,在项目测试的时候,同事的7.0系统相机拍照就崩了,进入相...
  • liu2193327638
  • liu2193327638
  • 2017-11-08 15:36:24
  • 103

解决 Android 7.0 调用照相机照相报错

解决代码: // 判断存储卡是否可以用,可用进行存储 String sdStatus = Environment.getExternalStorageState(); ...
  • github_36713209
  • github_36713209
  • 2017-08-24 09:27:11
  • 194

android调用相机拍照后,导致OOM

背景:调用相机拍照,结果返回时,导致内存迅速升高,内存不足时会导致OOM发现的原因:在相机拍照后,会生成很大的照片,分辨率也很高,因此占用的内存会很大,在网上找了一些同学的相机拍照代码块发现,使用到一...
  • oLimxing
  • oLimxing
  • 2016-03-03 13:57:03
  • 1529

Android调用系统相机拍照并保存,解决OOM

在Android应用经常碰到需要调用相机拍照并保存的情况,这里笔者写了一个小小的Demo,同时解决相片太大造成的OOM。...
  • Xiong_IT
  • Xiong_IT
  • 2015-01-12 16:09:10
  • 5456

调用Android相机拍照的问题

在Activity中通过如下代码可以启动相机,然后再重写的onActivityResult方法中可以获取到返回的照片数据:  Intent openCameraIntent = new Intent...
  • qq_25184739
  • qq_25184739
  • 2015-11-07 22:30:26
  • 381
收藏助手
不良信息举报
您举报文章:【Android】Android7.0调用相机拍照等问题
举报原因:
原因补充:

(最多只允许输入30个字)