zoukankan      html  css  js  c++  java
  • Android 7.0下,拍摄照片报错

    对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

    要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。

    解决方法:

    首先在AndroidManifest.xml的<application>标签内添加<provider>

           <!-- 文件共享 -->
            <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="${APPLICATION_ID}.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>

    接下来在res文件夹下创建xml子文件夹(如果已存在,忽略),并新建文件provider_paths.xml

    内容如下

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path path="." name="external_files"/>
    </paths>

    接下来在跳转时,传入的Uri不再是使用

    Uri.fromFile(tmpFile);

    而是使用FileProvider的getUriForFile()方法获取

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        tempFile = File.createTempFile("head", null, StorageUtils.getImageDir(context));
        Uri imgUri = FileProvider.getUriForFile(context,
                BuildConfig.APPLICATION_ID + ".provider", tempFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
        startActivityForResult(intent, REQUEST_TAKE);

    参考地址

  • 相关阅读:
    GTD180007:【运维】LINUX学习
    GTD180006:【运维】安装调试GDB
    {done}GTD180005:【翻译】LISP prehistory
    ComPiler180001:【学习】编译器学习链接
    AIIE180002:AIIE2015大会主题
    AIIE180001:AIIE2016大会主题
    GTD180004:【开发】python_med
    GTD180003:【开发】python_oeis
    欧亚大帝国及一战、二战
    大洲分界线
  • 原文地址:https://www.cnblogs.com/wenhui92/p/6361320.html
Copyright © 2011-2022 走看看