androidfileprovider(androidfileprovider冲突)
本篇文章给大家谈谈androidfileprovider,以及androidfileprovider冲突对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、解决Android11上分享图片失败,微信提示需要使用FileProvider
- 2、记一次Android 11上的FileProvider使用
- 3、android FileProvider的使用
- 4、Android中的FileProvider粗解
- 5、android 如何保证fileprovider一致
- 6、android fileprovider怎么设置external-path
解决Android11上分享图片失败,微信提示需要使用FileProvider
先看下微信分享错误的提示:
看到这个错误大家第一个可能会想到FileProvider我在AndroidManifest早已配置过了,但是配置了是你可以使用FileProvider存储了应用间共享文件,但是在并不代表你使用了FileProvider,然后了解问题我们就要先了解一个概念 分区存储
Android 10之前,外部存储区的内容主要以两种形式:
在Android 10 中,Google首次引入了 分区存储 ,将公共区域划分成了不同的集合,并且在媒体文件和其他文档之间建立了清楚的分割。经过划分之后应用不可以随意访问外部存储区中的文件,而只能访问媒体文件。
Android 11 (API 级别 30) 进一步增强了平台功能,为外部存储中的应用和用户数据提供了更好的保护。
从 Android 11 开始,使用 分区存储模式 的应用即使拥有 READ_EXTERNAL_STORAGE 权限,也无法再访问外部掘拿存储中的任何其他应用的 专属目录 中的文件
受到这一限制的影响,如果你的应用通过第三方 SDK 分享文件 ( 例如分享照片给另一应用上的好友 ) 到其他应用,而这只是将自己专属目录中的文件路径传递给目标应用,目标应用将无法读取该文件。部分分享 SDK 可能没有正确处理这种情形,没有显式报凳散陵错而只是静默失败 (对方用户都没有意识到这次分享),影响开发者和用户的体验。
FileProvider是Android7就提出的应用间共享文件适配方式,而目前大多数应用和SDK都具备这中方式
如果您的应用需要在 Android 11 上向其他应用分享文件,请检查您使用的第三方分享 SDK 是否支持通过 FileProvider 进行分享 (现在大部分常用的第三方分享 SDK 均已支持)。通过 FileProvider,您的应用能够允许第三方应用读取所分享的文件,而不会受到分区存储的限制
这里微信已经支持通过了FileProvider形式进行分享了,我们可以直接调用
在项目的AndroidManifest.xml添加相关配置,示例如下:
在res/xml目录(如果没有xml目录,则新建一个)下,添加文件file_provider_paths.xml,内容如下:
external-files-path表示通过 Context.getExternalFilesDir(null) 接口获取到的目录下的文件才可被共享,其他未配置的路径均不可被分享。 同枣戚样的节点可以配置多个,以支持多个不同的子目录 ,如下所示:
将路径通过FileProvider的接口转换成 content://URI 形式,示例如下:
参考文档 OpenSDK支持FileProvider方式分享文件到微信
[img]记一次Android 11上的FileProvider使用
paths 下标签和路径介绍渗敏:
-清单文件袜戚中设置 FileProvider 外部丛好枝可访问和 action
android FileProvider的使用
对于面向Android 7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开。如果一项包含文件URI的intent离开您的应用,则应用出现故障,并出现FileUriExposedException异常。
以下为使用方法:
在清单文件注册一个 fileprovider
位置在/res 文件夹下 xml 文件夹中
在paths节点内部支持以下几个子节点,分别为:
每个节点都胡汪悉支持两个属性:
上面的例子中 目录即为:Environment.getExternalStorageDirectory()/陵早download,其他同理。
下面的例子为在不同版本中获取uri的方法
当与intent一起使用时,不要忘记增加一个flag
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
裤乎 以下例子为发送彩信:
参考博客:
Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
Android中的FileProvider粗解
FileProvider 是安卓7.0以上版本因为谷歌官方对 StrictMode (严格模式)的开启而产生的安全机制的产物(也就是说,在7.0以下是不需要它的),它继承自 ContentProvider 。
不是。只有在你需要把文件在2个(或以上)app之间交互的时候才需要它。有人说我也没打算把我的app的数据给别的app或者需要别的app给我数据呀?其实不然,不一定其他app是指第三方app,还包括系统app,比如:系统相机拍照(让系统相机把照片保存到你指定的路径)?要不再把照片给裁剪一下( uCrop 中的 UCrop.of(xxx).start() 方坦镇法其实也是用 startActivityForResult(xxx) 方法)?检测到新版本时候再自动安装一下(把需要安装的apk包给系统安装器来安装)?
总的来说就一句话: 只要你需要把文件地址(比如: )用 Intent 传递的时候就必须用它。
简单来说就是把 这种File格式地址改造为 Uri 格式地址 content://xxx/xx 。
那怎么改呢?很简单: Uri uri = FileProvider.getUriForFile(context,authority,file); ,第2个参数待会儿再讲,第3个参数就是需要被改造的File文件,这个Uri的路径格式就是上面提到的 content://xxx/xx 。
但是,在使用这个方法之前还有2个前提步骤需要先做:
简单作一下解释:
android:name :实际解析处理这个 provider 的 FileProvider ,这个一般就用系统贺盯帮我实现的 androidx.core.content.FileProvider 。不一定非要 androidx 里的, v4 包也有这种 FileProvider 。当然,你也可以自己实现一个。
android:authorities :前面提到的 .getUriForFile(xxx,authority,xxx) 就是它。作用就是用它来匹配找到对应该使用哪个 provider 的。值得注意的是,这个值在一个app中必须是唯一的,所以最好根据 ${applicationId} 来让 gradle 来自动生成。不过也不是一定要这么搞,如果这个 provider 本身就是 app 里使用,并不是作为一个 module 或 lib 来使用的话,你也可以写死。(它本质是一个字符串而已,但是很多博文禅信和都是 ${applicationId}.fileProvider ,其实大可不必,你随便写一个都行,只要在上面那个方法的第二个字段跟它一样就行。)
android:exported :是否需要公开这个 provider ? 一般我们单进程干活的app都设置为false就行
android:grantUriPermissions :是否授权这个文件给第三方。更多信息可以自行了解一下 Context.grantUriPermission(toPackage,uri,modeFlags) 这个方法
meta-data 里的 android:name :也是固定值不用动,源码里就是写死的用这个值来解析xml的
meta-data 里的 android:resource :需要自己新建一个文件 res/xml/my_file_paths.xml ,路径与文件名就是这个值。
paths 里值可以是如下几个:
上面的 name 里的 xxx 是用作生成的 Uri 格式路径的中间路径,比如: content://com.example.myapp/xxx/test1.jpg
上面的 path 里的 xxxx 是用作生成 File 格式路径的中间路径,比如:
/storage/emulated/0/Android/data/com.example.myapp/files/xxxx/test1.jpg
上面每个值后面的注释就是上面这个 File 格式对应的,比如: external-files-path 对应的 context.getExternalFilesDir(type) 获取到的值---- /storage/emulated/0/Android/data/com.example.myapp/files
也就是说,当需要传递某个文件时,你可以用以上 context.getXxxDir() 方法的路径来选择具体在 paths.xml 里写对应哪个值。还是最开始讲的那句:其目的无非就是把 File 的路径转为 Uri 来暴露给其他 app 。
好了,至此讲得差不多。
android 如何保证fileprovider一致
1.首先,需要在清单文件中声明一个provider,如下:
provider
android:name="中明android.support.v4.content.FileProvider"
android:authorities="com.android.demo.fileProvider" // 名字,这个可以自行设置,通常都设置为包名.fileProvider
android:exported="false"
android:grantUriPermissions="true"
meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/camera_path" / // 在res下创建xml文件夹
/provider
之所以需要声明,是因为FileProvider是身为Android四大组件之一的ContentProvider的子类,因此需要在清单文件中声明。
2.刚才的声明的最后一行,看到了一个xml文件。这个文件的作用是为FileProvider提供可以暴露的路径,一旦一个路径在文件中被声明,那么就可以被FileProvider提供。下面看一下这个xml文件中的内容:
?xml version="1.0" encoding="utf-8"?paths
external-path path="Demo/" name="Camera" / // 外部存储,本文案例用的就是这个,注意这里的path就是共享的图片路径(我前面设置的文件路径就是外部存储下的Demo文件夹),name代表使用这个字段去访问真实的文件路径
// 以下是path可以设置的其他根节点路径 root-path/ // 设备根目录,等同于直接new File("/") files-path/ // 内部存储空间应用私有目录卖伍告下的files/ 目录,等同于Context.getFilesDir() 所获取的目录路径 cache-path/ // 内部存储空间应用私有目录下的cache/ 目录,等同于Context.getCacheDir() 所获取的目录路径 external-files-path // 外部存储空间应用私有目录下的files/ 目录,等同于Context.getExternalFilesDir(null) 所获取的目录路径 external-cache-path // 外部存储空间应用私有目录下的cache/ 目录,等同于Context.getExternalCacheDir()/paths
应该很多朋友好奇为什么要将路径写到这么一个xml文件里。因为我们现在使用FileProvider来提供这个文件,而FileProvider是ContentProvider的子类,它用content:// Uri 代替了 Uri。因此需要通过path以及name一起来供FileProvider来找到文件的位置。这样也更加安全的向第三方程橘耐序提供文件内容了。
3.接下来,就来看看FileProvider类是如何帮助我们来调用系统相机的:
private void takePhoto7() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(this.getPackageManager()) != null) {
File file = new File(getCameraSavePath());
Uri uri = FileProvider.getUriForFile(this, "com.android.demo.fileProvider", file); // 主要就是这行代码,通过FileProvider获取文件的uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
this.startActivityForResult(intent, 1000);
}
}
getUriFromFile方法中的第二个参数就是我们在清单文件中声明的provider的authorities。(一定要一样)
4.在7.0的手机上运行后,就会发现成功的调用了系统的相机并实现了拍照。同时,可以打印出uri。我这个案例中的uri为:
content://com.android.demo.fileProvider/Camera/Camera.png
android fileprovider怎么设置external-path
我还没用过2003,只好帮你猜一猜了。 2003 下的 Path 值默认:运行》输入 cmd [确定]打开 MS-DOS 方式》输入 path 回车。 利用 DOS 设置 Path 值:在 MS-DOS 方扰慧改式 输入缓判:path=%path%;你的路径。比如 path=%path%;d:\tools\ %path% 指原有的 path 值,不输入的话原值会丢失。 利用系统属性设置 Path 值:按 Win + Pause 或在“我的电脑碧仔”右键选“属性”》到“高级”页》点“环境变量”》在“环境变量”对话框可设置/新建用哀悼变量和系统变量。 Windows 2003 可能有所不同,这里仅给你一些思路。
关于androidfileprovider和androidfileprovider冲突的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。