bug exposed beyond app through Intent.getData()

转载大神,用于自己学习

今天在做项目功能的时候遇到一个bug exposed beyond app through Intent.getData()

在项目中点击文件路径跳转过去,编译器报错android os FileUriExposedException

导致错误的原因是没有使用FileProvider

在应用间共享文件

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

解决方法

在AndroidManifest中配置 FileProvider

复制代码
<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths_public" />
        </provider>

其中${applicationId}一般指向包名

不是androidx的可以参考

复制代码
<provider
    android:name="android.support.v4.content.FileProvider"
     android:authorities="${applicationId}.provider"
      android:exported="false"
    android:grantUriPermissions="true">
      <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_paths_public" />
</provider>

还需要res下创建xml文件夹,并在xml文件夹下创建file_paths_public.xml

复制代码
 <!--1、对应内部内存卡根目录:Context.getFileDir()-->
    <files-path
        name="int_root"
        path="/" />
    <!--2、对应应用默认缓存根目录:Context.getCacheDir()-->
    <cache-path
        name="app_cache"
        path="/" />
    <!--3、对应外部内存卡根目录:Environment.getExternalStorageDirectory()-->
    <external-path
        name="ext_root"
        path="pictures/" />
    <!--4、对应外部内存卡根目录下的APP公共目录:Context.getExternalFileDir(String)-->
    <external-files-path
        name="ext_pub"
        path="/" />
    <!--5、对应外部内存卡根目录下的APP缓存目录:Context.getExternalCacheDir()-->
    <external-cache-path
        name="ext_cache"
        path="/" />

使用方法

复制代码
 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  Uri contentUri = FileProvider
  .getUriForFile(OrderManagerActivity.this, "com.jk.house", file);
  intent.setDataAndType(contentUri, "*/*");

作者:吕氏春秋

链接:https://juejin.cn/post/6939823618918449166

相关推荐
lichong9514 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
爱学习的大牛1237 小时前
MVVM 架构 android
android·mvvm
alexhilton9 小时前
理解retain{}的内部机制:Jetpack Compose中基于作用域的状态保存
android·kotlin·android jetpack
꒰ঌ 安卓开发໒꒱10 小时前
Mysql 坏表修复
android·mysql·adb
_李小白10 小时前
【Android Gradle学习笔记】第八天:NDK的使用
android·笔记·学习
袁震10 小时前
Android-Compose 列表组件详解
android·recyclerview·compose
2501_9160074711 小时前
提升 iOS 26 系统流畅度的实战指南,多工具组合监控
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan12 小时前
android 利用反射和注解绑定控件id和点击事件
android·注解·反射·控件绑定
Brianna Home13 小时前
从零到一:用Godot打造2D游戏《丛林探险》
算法·游戏·性能优化·游戏引擎·bug·godot·动画
这个杀手不太累14 小时前
Android ProcessLifecycleOwner
android·lifecycle