首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android.os.FileUriExposedException:通过Intent.getData()在应用程序之外暴露的<filename>

android.os.FileUriExposedException是Android开发中的一个异常,它表示在应用程序之外暴露了一个文件URI。这个异常通常在Android 7.0及以上版本中出现,是由于Android 7.0引入了一项安全机制,禁止应用程序在Intent中使用file:// URI来共享文件。

在Android 7.0之前的版本,我们可以通过在Intent中使用file:// URI来共享文件,例如通过Intent.ACTION_SEND将文件发送给其他应用。但是,这种方式存在安全风险,因为file:// URI可以访问应用程序的私有文件,可能会导致敏感数据泄露。

为了解决这个安全问题,Android 7.0引入了FileProvider类。FileProvider是一个特殊的ContentProvider,它允许应用程序共享私有文件,同时提供了更好的安全性。

要修复android.os.FileUriExposedException异常,可以按照以下步骤进行操作:

  1. 在AndroidManifest.xml文件中注册FileProvider:
代码语言:txt
复制
<manifest>
    <application>
        ...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>
  1. 创建一个XML文件(例如file_paths.xml),定义要共享的文件路径:
代码语言:txt
复制
<paths>
    <files-path name="my_images" path="images/" />
    <files-path name="my_docs" path="docs/" />
</paths>

在上面的示例中,我们定义了两个文件路径:images/和docs/。你可以根据自己的需求添加更多的文件路径。

  1. 在代码中使用FileProvider来获取文件的URI:
代码语言:txt
复制
File imagePath = new File(context.getFilesDir(), "images");
File newFile = new File(imagePath, "example.jpg");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.fileprovider", newFile);

在上面的示例中,我们使用FileProvider.getUriForFile()方法来获取文件的URI。第一个参数是Context对象,第二个参数是FileProvider在AndroidManifest.xml中定义的authorities属性,第三个参数是要共享的文件。

通过上述步骤,我们可以修复android.os.FileUriExposedException异常,并安全地共享文件给其他应用程序。

推荐的腾讯云相关产品:腾讯云对象存储(COS)

  • 概念:腾讯云对象存储(COS)是一种高可用、高可靠、安全、低成本的云存储服务,适用于存储和处理任意类型的文件。
  • 分类:云存储服务
  • 优势:高可用性、高可靠性、安全性高、低成本、灵活性强
  • 应用场景:网站和应用程序数据存储、大规模数据备份和归档、多媒体内容存储和分发、云原生应用程序存储等。
  • 产品介绍链接地址:腾讯云对象存储(COS)

注意:本答案中没有提及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等流行的云计算品牌商,如需了解更多相关品牌商的信息,请自行搜索。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 7.0 FileUriExposedException 处理

---- 发现问题 前几天把手机系统升级到基于 Android 7.0,后来升级调试一个应用时抛出如下异常信息: android.os.FileUriExposedException: file://...解决问题 官方给出解决方式是通过 FileProvider 来为所共享文件 Uri 添加临时权限,详细请看这里 标签下添加 FileProvider 节点 表示应用程序内部存储目录下...想要通过 FileProvider 为文件生成 content URI 只能在此处指定目录,以上示例就表示我将要共享 Android/data/com.xxx.xxx/cache/app/ 这个目录,除此之外还可以共享其它目录...结语 除了上面这个问题, API Level 24(Android 7.0)之前开发分享图文、浏览编辑本地图片、共享互传文件等功能如果没有使用 FileProvider 来生成 URI 的话, Android

77020
  • Android7.0适配之FileProvider

    注:本文targetSdkVersion 25 ,compileSdkVersion 25 二、拍照案例 大家应该对于手机拍照一定都不陌生,希望得到一张高清拍照图时候,我们通过Intent会传递一个...此时如果我们使用Android 7.0或者以上原生系统,再次运行一下,你会发现应用直接停止运行,抛出了android.os.FileUriExposedException: Caused by: android.os.FileUriExposedException...,都给他们授权~~ 恩,你可以不需要时候通过revokeUriPermission移除权限~ 那么增加了授权后代码是这样: public void takePhotoNoCompress(View.../0/testandroid7-debug.apk exposed beyond app through Intent.getData() 好在有经验了,简单修改下uri获取方式。...所以addFlags方式对于ACTION_IMAGE_CAPTURE5.0以下是无效,所以需要使用grantUriPermission,如果是正常通过setData分享uri,使用addFlags

    1.7K40

    Android N 7.0中报错:android.os.FileUriExposedException解决方法

    发现问题 最近在Android N 上 安装Apk时报错:android.os.FileUriExposedException: file:///storage/emulated/0/Download/...appName-2.3.0.apk exposed beyond app through Intent.getData(),通过查找相关资料终于找到了解决方法,下面分享给大家,话不多说了,来一起看看详细介绍吧...解决方法 1、AndroidManifest.xml中添加如下代码 <provider android:name="android.support.v4.content.FileProvider"...是我们接下来要添加文件 2、res目录下新建一个xml文件夹,并且新建一个file_pathsxml文件(如下图) ?...参考地址 总结 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ZaLou.Cn支持。

    1.5K20

    小技巧:通过 New-Ailas 指令 Powershell 上启动多个不同版本应用程序

    小技巧:通过 New-Ailas 指令 Powershell 上启动多个不同版本应用程序 如果你像我一样,电脑上安装有多个 Java 的话,你肯定会遇到这样烦恼:当我们试图命令行中调用其他非...classpath 上 java.exe 时,需要费尽心思找到这些 Java 路径,以全路径执行,这十分费时费力。...但是如果你正在使用 Powershell 的话,现在这些问题就可以得到解决了,解决方法就是 New-Ailas 指令 New-Ailas 指令完整用法如下: New-Alias [-Name]...[-PassThru] [-Scope ] [-Force] [-WhatIf] [-Confirm] [] 你可以...举个例子,当我们想要通过使用 java16 来代表 Java 16 完整路径 "D:\ProgramData\.jdks\openjdk-16.0.2\bin\java.exe" 时,我们便可使用 New-Alias

    1.1K30

    CVE-2021-21234 Spring Boot 目录遍历

    0.2.13 版本之前 spring-boot-actuator-logview 中存在目录遍历漏洞。...该库本质是通过 admin(spring boot 执行器)HTTP 端点公开日志文件目录。要查看文件名和基本文件夹(相对于日志文件夹根)都可以通过请求参数指定。.../somefile` 将不起作用),但没有充分检查基本文件夹参数,因此`filename=somefile&base=../` 可以访问日志记录基目录之外文件)。该漏洞已在 0.2.13 版中修补。...0.2.12 任何用户都应该能够毫无问题地进行更新,因为该版本中没有其他更改。除了更新或删除依赖项之外,没有解决此漏洞方法。...但是,删除运行应用程序用户对运行应用程序不需要任何目录读取访问权限可以限制影响。此外,可以通过反向代理后面部署应用程序来限制对 logview 端点访问。

    1.7K30

    webpack打包原理 ? 看完这篇你就懂了 !

    当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要每个模块,然后将所有这些模块打包成一个或多个 bundle。...webpack 通过 Tapable 来组织这条复杂生产线。webpack 在运行过程中会广播事件,插件只需要监听它所关心事件,就能加入到这条生产线中,去改变生产线运作。...基本上,整个应用程序结构,都会被编译到你指定输出路径文件夹中。 Module 模块, Webpack 里一切皆模块,一个模块对应着一个文件。...本质上,webpack loader 将所有类型文件,转换为应用程序依赖图(和最终 bundle)可以直接引用模块。...以上过程中,Webpack 会在特定时间点广播出特定事件,插件监听到感兴趣事件后会执行特定逻辑,并且插件可以调用 Webpack 提供 API 改变 Webpack 运行结果。

    1.3K20

    预加载脚本 | Electron 安全

    Electron 安全这件事,如果大家不做出反应,应用程序开发者是不会有所行动,这无异于电脑中埋了一些地雷 我们公众号开启了留言功能,欢迎大家留言讨论~ 这篇文章也提供了 PDF 版本及 Github...,因此重要逻辑不应该在预加载脚本中进行,也不应该赋予其过于繁重责任,完成主进程与渲染进程之间通信,将通信结果传递给另一方才是它实际意义,通过暴露方法使这种固定逻辑可以被渲染进程调用 因此预加载脚本渲染器加载网页之前注入...,这个模块公开了一个全局 API,用于调度将来某个时间段调用函数。...其他 Buffer 相关方法 }); // 渲染进程中,可以通过 window.myAPI 来访问预加载脚本提供方法 我看很多 V8 漏洞Payload 都会使用到 Buffer ,看起来似乎是与二进制数据处理离不开模块...,但是有些泄漏可能是不容易发现,例如有几个函数只是给 Preload 自己使用,但是不小心暴露给了渲染进程;函数是给自己写渲染进程使用,结果同时暴露给了 iframe 这种嵌入内容等 预加载脚本是一个很好代码审计切入点

    28610

    安全研究 | 如何查看GitLab中共享敏感数据

    关于GitLab Watchman GitLab Watchman这款应用程序可以帮助广大研究人员使用GitLab API来审查GitLab内部暴露敏感数据和凭据。...: 24小时; 7天; 30天; 所有时间; 这也就意味着,一次深度扫描之后,我们可以安排GitLab Watchman定期运行,并且只返回所选时间段结果。...规则格式如下所示: --- filename: enabled: #[true|false] meta: name: author: date: description:...关于检测规则更多内容,请查看项目下docs/rules.md文件。 .conf文件 配置选项可以watchman.conf文件中进行配置,该文件必须存储项目的根目录下。...除此之外,本项目还提供了一份配置文件样本,路径为docs/example.conf。

    1.7K20

    基于 Traefik 加权灰度发布

    实际业务场景规划中,如果我们将 Trafik 放在 Docker,Kubernetes,甚至是传统 VM / 裸金属部署,并展示如何获取有关运行服务信息,它将自动将它们暴露在集群外面。... Traefik 2.x 发布特性中我们了解到除了其固有的基础功能之外,其还支持一些其他高级特性,例如,中间件,流量复制及金丝雀发布等等。...中去,然后通过将一个命名为 traefik-dynamic-conf ConfigMap 对象挂载到 /config 目录下面去,接下来再通过 --providers.file.filename 参数指定配置文件来开启...除此之外,它还添加了一个路由规则主机(``)。 但在我们例子中,我们不希望为容器提供任意服务。...相反,我们确切地知道普通应用程序容器(app_normal)服务名称和金丝雀应用程序容器(app_canary)服务名称。因此,我们需要以某种方式将容器(即服务器)绑定到所需服务。

    1.4K40
    领券