Android 7.0 fileprovider使用以及遇到的坑

Android7.0以后对系统文件访问权限校验更加严格。

以前使用的file://模式会抛出错误 FileUriExposedException错误,7.0以后需要配置fileprovider来进行文件访问。

当前项目中的使用场景:

1.相机拍照

2.调用系统安装APK

使用

1.因为Android主工程跟依赖工程都使用provider的时候可能会产生冲突,一般需要自定义一个provider继承系统FileProvider,在AndroidMainest.xml中属性的name使用自定义的provider

2.主工程与依赖库的xml/file_paths.xml文件路径不能相同,里面的属性name也不能相同否则会覆盖掉依赖工程的路径。

public class MyFileProvider extends FileProvider {
}

 在res文件下添加file_paths配置文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <!--对应DEVICE_ROOT,也就是File DEVICE_ROOT = new File("/"),即根目录,一般不需要配置。-->
        <root-path name="root" path="" />
       <!--代表文件位于手机内部存储空间,访问效果如同 getFilesDir();-->
        <files-path name="apk_download" path="test/apk" />
       <!--代表文件位于手机内部缓存空间,访问效果如同 getCacheDir()-->
        <cache-path name="cache" path="" />
        <!--external-path 代表文件位于手机外部存储空间,访问效果如同 Environment.getExternalStorageDirectory()  Android11不能访问 -->
        <!--getExternalFilesDir(null);  得到的路径/storage/emulated/0/Android/data/yourPackageName/files-->
        <external-path name="download" path="test/apk" />
        <!--代表与Context#getExternalFilesDir(String) 和Context.getExternalFilesDir(null)相同的文件路径-->
        <external-files-path name="name" path="path" />
        <!--代表与Context.getExternalCacheDir()相同的文件路径-->
        <external-cache-path name="name" path="path" />
    </paths>
</resources>

在AndroidMainfest.xml中进行配置

        <provider
            android:name="com.test.test.MyFileProvider"
            android:authorities="包名.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

authorities:标识,在当前系统内的唯一值,一般使用包名。

exported:表示该FileProvider是否需要公开出去

grantUriPerMisssions = true :允许授权文件的临时访问权限。

使用
 

String sdpath = getExternalFilesDir(null)+File.separator+"test/apk";

test/apk是自己在file_paths中配置的路径

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName()+".fileprovider", apkfile);

安装APK的时候需要临时授权。

遇见的问题:

1.在小米Android 11上面Environment.getExternalStorageDirectory()获取的路径报FileNotFoundException。

解决办法:

用getExternalFilesDir(null)代替

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
状态栏的问题是什么?为什么在7.0以上的手机上运行时感觉没有沉浸式状态栏了?如何解决这个问题? 回答: 在Android 7.0以上的手机上,出现了一个问题,即无论怎么修改状态栏背景色都没有效果,看起来不再是沉浸式的状态栏。这个问题的原因是在Android 7.0之前,状态栏的实现是通过DecorView这个类来完成的,而在7.0以上,DecorView变成了一个独立的类,并且增加了一些新的属性和方法。其中一个新的属性是mSemiTransparentStatusBarColor,这个属性可能与我们要解决的问题有关。\[1\]\[2\]\[3\] 要解决这个问题,我们可以尝试修改mSemiTransparentStatusBarColor属性的值,以达到我们想要的状态栏效果。具体的实现方法可能需要根据具体的应用程序和代码来进行调整。可以通过查看相关的文档和源代码来了解如何正确地修改这个属性。 #### 引用[.reference_title] - *1* *2* [android状态栏半透明灰色,快速解决Android7.0下沉浸式状态栏变灰的问题](https://blog.csdn.net/weixin_35792040/article/details/117493339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [android状态栏半透明灰色,Android7.0沉浸式状态栏蒙灰问题完美解决](https://blog.csdn.net/weixin_34493827/article/details/117493345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值