关键词:
异常原因
Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。原因在于使用file://Uri会有一些风险,比如:
- 文件是私有的,接收
file://Uri
的app无法访问该文件。 - 在Android6.0之后引入运行时权限,如果接收file://Uri的app没有申请
READ_EXTERNAL_STORAGE
权限,在读取文件时会引发崩溃。
因此,google提供了FileProvider
,使用它可以生成content://Uri
来替代file://Uri
。
解决流程
- 添加res/xml/provider_paths.xml 文件
- 在
AndroidManifest.xml
中添加provider - 在代码里使用
FileProvider.getUriForFile
()方法获得Url
添加res/xml/provider_paths.xml 文件
在 res/xml 目录下新建一个 xml 文件,用于存放应用需要共享的目录文件。这个 xml 文件的内容类似这样:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="cam" path="images" /> </paths>
- <files-path>:内部存储空间应用私有目录下的 files/ 目录,等同于 Context.getFilesDir() 所获取的目录路径;
- <cache-path>:内部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getCacheDir() 所获取的目录路径;
- <external-path>:外部存储空间根目录,等同于 Environment.getExternalStorageDirectory() 所获取的目录路径;
- <external-files-path>:外部存储空间应用私有目录下的 files/ 目录,等同于 Context.getExternalFilesDir(null) 所获取的目录路径;
- <external-cache-path>:外部存储空间应用私有目录下的 cache/ 目录,等同于 Context.getExternalCacheDir();
可以看出,这五种子元素基本涵盖内外存储空间所有目录路径,包含应用私有目录。同时,每个子元素都拥有 name 和 path 两个属性。其中,path 属性用于指定当前子元素所代表目录下需要共享的子目录名称。注意:path 属性值不能使用具体的独立文件名,只能是目录名。而 name 属性用于给 path 属性所指定的子目录名称取一个别名。后续生成 content:// URI 时,会使用这个别名代替真实目录名。这样做的目的,很显然是为了提高安全性。如果我们需要分享的文件位于同级别目录下不同的子目录中,就需要添加多个子元素逐一指定要分享的文件目录,或者共享他们通用的父目录也行。
不同的app可能会有要求不同的共享目录,这个要求的共享目录可以在报错里找到,添加对应的报错路径即可.
在AndroidManifest.xml
中添加provider
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.yt.demo.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/yourfilename" /> </provider>
请注意authorities这行,需要添加你的包名 加 后缀
在代码里使用FileProvider.getUriForFile
()方法获得Url
例子代码如下:
String filePath = Environment.getExternalStorageDirectory() + "/images/"+System.currentTimeMillis()+".jpg"; File outputFile = new File(filePath); if (!outputFile.getParentFile().exists()) outputFile.getParentFile().mkdir(); Uri contentUri = FileProvider.getUriForFile(this, getPackageName()+".fileprovider", outputFile);
关于android未来开发的方向探讨
文章目录背景Anroid应用开发工程师技能参考Android基础设施建设技能参考Android逆向开发工程师技能参考AndroidFramework工程师技能参考(车载系统、系统开发方向)Android性能优化工程师技能参考Android音视频开发技能参考总结... 查看详情
关于android开发导航app源码分享
今天我给大家分享的是一份关于Android导航的app源码点击下载源码请添加链接描述 查看详情
关于 iOS 和 Android 多人游戏开发的建议? [关闭]
】关于iOS和Android多人游戏开发的建议?[关闭]【英文标题】:SuggestionsaboutmultiplayergamedevelopmentoniOSandAndroid?[closed]【发布时间】:2011-05-0823:41:40【问题描述】:我正在开发一款简单的游戏,以体验移动平台上的多人游戏开发,尤其... 查看详情
如何在 Android 7.0+ 中检索 SD 卡的序列号?
】如何在Android7.0+中检索SD卡的序列号?【英文标题】:HowcanIretrieveanSDcard\'sserialnumberinAndroid7.0+?【发布时间】:2017-09-1500:34:44【问题描述】:注意:这个问题是关于物理SD卡的序列号,而不是已安装的volume的UUID。这是两个独立的... 查看详情
关于开发转岗的问题
...我做了大概一年的JavaEE开发,而后就进入了当年非常火的Android领域,一直到今年初,大概做了4年Android开发吧,又转到了JavaEE开发。这次转岗的原因,主要是感觉Android各个方面 查看详情
关于node升级到7.0,无法gulpalljs的问题
http://stackoverflow.com/questions/40308623/cannot-find-module-internal-fs-afer-upgrading-to-node-7 1.删除node_modules2.npmcacheclean3.npminstall4.gulpalljs搞定! 查看详情
关于 Android 版 Facebook SDK 的开发和发布密钥哈希的问题
】关于Android版FacebookSDK的开发和发布密钥哈希的问题【英文标题】:QuestionsaboutDevelopmentandReleaseKeyHashesforFacebookSDKforAndroid【发布时间】:2015-12-2310:37:52【问题描述】:我阅读了FBDeveloper网站上的指南。创建开发密钥哈希keytool-export... 查看详情
(Unity) Admob 横幅未在 Android 7.0 上显示
】(Unity)Admob横幅未在Android7.0上显示【英文标题】:(Unity)AdmobbannersnotshowingonAndroid7.0【发布时间】:2021-04-1907:08:25【问题描述】:我已经遇到这个问题好几天了,但似乎无法理解问题所在。我已经为Android开发了一个2DUnity游戏,并... 查看详情
android7.0怎样启动service
android7.0启动service有两种方法:1、Context.startService()调用者与服务之间没有关联,即使调用者退出,服务仍可运行2、Context.bindService()调用者与服务绑定在一起,调用者一旦退出,服务也就终止参考技术A 安卓7.0开启夜间模式介... 查看详情
android记录22-关于开发中账号绑定的逻辑处理(代码片段)
Android记录22-关于开发中账号绑定的逻辑处理 转载请注明:IT_xiao小巫 博客地址:http://blog.csdn.net/wwj_748前言本篇博客要跟大家分享的是开发中我们常常遇到的账号绑定的功能开发,我们先来思考几个问题:1.为... 查看详情
android开发笔记关于弹窗(代码片段)
Android中提供几种不同的弹窗模式,Toast,Dialog,PopupWindow每种弹窗又对应了不同的应用场景,我们可以根据不同业务场景来选择。下面将会分别介绍上面四种不同弹窗的应用,同时也对每中弹窗的源码和所遇到... 查看详情
关于蓝牙开发之数据缓存问题(脏数据)(代码片段)
...多月了,这期间真是遇到了各种问题。因为我的是做Android手机与开发板中的蓝牙2.0相互通信,所以关于Google的Android设备之间的相互通信基本上是用不到。所以得自己摸索,其中最大的一个就是自动连接开发主板上的... 查看详情
关于android开发spinner显示的问题
比如上面这个spinner,有四个数据,存在array数组里面,然后用arrayAdapter适配数据。问题是:它会默认显示第一条数据“北京”,然后点开spinner以后它又会弹出“北京“,这样看着就重复了。怎么样让spinner默认显示”请选择“,... 查看详情
android开发:关于databinding与viewbinding以及kotlin-android-extensions(代码片段)
Databinding是我在java时期最喜欢用的一种获得xml控件id的工具,但是他只比findViewbyId简单一些,每一次新建一个fragment我都需要针对性地配置一遍Databinding。我们先来看一看Databinding的用法:首先在build.gradle中的defaultConfig... 查看详情
android开发:关于databinding与viewbinding以及kotlin-android-extensions(代码片段)
Databinding是我在java时期最喜欢用的一种获得xml控件id的工具,但是他只比findViewbyId简单一些,每一次新建一个fragment我都需要针对性地配置一遍Databinding。我们先来看一看Databinding的用法:首先在build.gradle中的defaultConfig... 查看详情
安卓7.0没有无线adb
...考技术B对,安卓7.0之前的系统都不支持无线ADB,只有从Android7.0开始才开始支持。 查看详情
关于android应用程序漏洞的防护措施
目前,Android应用程序市场的发展速度飞快,不少开发者为了追求开发速度而忽视应用程序的安全。但由于Android系统的开源性及其Java编写的特殊性,各类Android App经常被爆出漏洞,有的Android开发者只是对App... 查看详情
关于android混淆文件统一管理
概述对于学习Android开发的我们都知道,在发布生产包时需要对项目开启混淆,这样可以避免项目代码暴露在别人面前。而AndroidStudio在build.gradle文件配置上也非常贴心的提供了开启代码混淆的方式,开发者只要按照官... 查看详情