Android7.0以上的分享图片文件错误及解决方法

本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/16866593.html

本篇大约有1670个字,阅读预计需要2.09分钟


原文地址: Android7.0以上的分享图片文件错误及解决方法 - Stars-One的杂货小窝

在Android7.0以上版本,分享图片文件出现了exposed beyond app through ClipData.Item.getUri()这个报错

原因

实际上,是因为7.0以上版本开启了Uri路径导致的问题,不允许我们使用file://,只允许使用content://,我们需要做下FileProvider的适配即可解决此问题,或者将简单粗暴,直接将此验证给关掉

解决方法(关掉uri的验证)

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();

在application里写上上述代码即可

解决方法(适配FileProvider)

在res中创建xml文件夹(如果文件夹已存在,则跳过此步),创建一个名为myfileprovider.xml(名字可任取)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

之后,在AndroidManifest.xml中声明此Provider(下面的代码只需要把authorities和resource里的数值改下即可)

<application>
  ...
     <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="site.starsone.demo.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <!-- ressource file to create -->
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/myfileprovider">  
        </meta-data>
    </provider>
</application>

最后,在构建图片文件的uri的时候,使用下面方法构建(可以顺便加个版本的判断,Android7.0以上就走此方法构建Uri)

Uri imageUri = FileProvider.getUriForFile(
    MainActivity.this,
    "site.starsone.demo.provider", //(使用你自己的包名+“.provider" )
    imageFile);

PS:上面的第三个参数实际上就是在AndroidMainfest里Provider定义的authorities属性

参考

posted @   Stars-one  阅读(726)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示