安卓7.0文件存储权限变更
来源:互联网 发布:数据录入兼职平台 编辑:程序博客网 时间:2024/05/19 10:38
安卓7.0文件存储权限变更
相关网站
Setting Up File Sharing
首先,你要定义一个FileProvider在你的App的Manifest文件中,这个文件中有一个特殊的一栏就是authority,它是用于生成content URIs,下面是provider的形式
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application></manifest>
在这个例子中android:authorities是 FileProvider生成content URIs必备的权限属性
在这个例子中权限是com.example.myapp.fileprovider,对于我们自己的应用通常是由你的包名+字符串“fileprovider”,想查看更改关于权限值,你可以点击这里
(其中android:grantUriPermissions必须为true,android:exported必须为false)
是provider的子元素,它指向你想分享的一个XML文件,这个resource属性就是分享文件的路径和文件名,
Specify Sharable Directories
一旦你添加了 FileProvider在你的app得Manifest中,你就得添加一个相应的文件夹,这个文件中中包含了你想要分享的文件,通过在你的工程res目录下创建xml文件,添加filepaths.xml文件,下面是一个样例
<paths> <files-path path="images/" name="myimages" /></paths>
标签分享了一个文件在你app的内部存储文件夹中,path属性分享了一个在files/目录下的一个images/子目录,name属性告诉 FileProvider给文件files/images添加一个路径myimages给 content URIs。
这个元素有很多子类,不同的标签分享了不同的文件,除了标签外,你也可以用标签,它是分享外置存储文件夹的, 标签用于分享内置缓存文件夹的。
下面来看看他们的类型。
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> ...</paths>
标签中必须包含一个或者多个子元素
<files-path name="name" path="path" />
代表文件在你的应用内置存储区域files/下的子目录,这种类型和
Context.getFilesDir().
所返回的路径一样。
<cache-path name="name" path="path" />
这种表示在你应用App内置存储区域下的缓存文件,它和 getCacherDir()返回的路径一样。
<external-path name="name" path="path" />
这种代表在你App的外置存储的根目录下的文件,它和Context#getExternalFilesDir(String) Context.getExternalFilesDir(null).返回的路径一样。
<external-cache-path name="name" path="path" />
这种代表在你app的外置缓存区域根目录下的文件,它和Context.getExternalCacheDir().返回的路径一样。
以上的标签都有相同的属性name和path
其中name表示:一个URI路径,为了安全考虑,这个值隐藏在你要分享的子目录名字下面,这个子目录的名字就包含路径属性。
其中path表示:你要分享的子目录,当name属性是一个URI路径时,这个path的值实际上就是子目录的名字。
你必须指定一个子元素的path给每个你想分享的内容RUIs,例如
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> <files-path name="my_docs" path="docs/"/></paths>
这些XML元素指定了两个文件夹。
Generating the Content URI for a File
给一个文件生成Content URI
为了分享一个文件给任何app使用,你的App必须生成 content URI,
例如:如果你的App提供了一个文件给其他一个有com.mydomain.fileprovider的权限的应用通过FileProvider使用,为了获得URIs给文件default_image.jpg在你的内存存储子目录下的images/,你就得添加下面的代码。
File imagePath = new File(Context.getFilesDir(), "images");File newFile = new File(imagePath, "default_image.jpg");Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
通过上面的代码可以得到这样的结果,getUriForFile() 返回的路径是:
content://com.mydomain.fileprovider/my_images/default_image.jpg。
Granting Temporary Permissions to a URI
授予临时权限给URI
通过方法 Context.grantUriPermission(package, Uri, mode_flags) 的形式,添加mode_flags授予临时权限给URI,你可以设置为:
FLAG_GRANT_READ_URI_PERMISSION或者 FLAG_GRANT_WRITE_URI_PERMISSION 或者一起使用
也可以说通过revokeUriPermission() 撤销权限
然后通过Intent的setData()方法将content URI 设置进去,也可以通过 Intent.setFlags() 的方法将FLAG_GRANT_READ_URI_PERMISSION或者 FLAG_GRANT_WRITE_URI_PERMISSION,或者一起,设置为赋予权限。
最后将Intent传递给其他app,经常使用的是setResult()方法。
另外,权限赋予在一个Intent中仍然有效,只要Activity栈中activity是处于激活状态的。当activity结束了,权限赋予会自动移除。
- 安卓7.0文件存储权限变更
- 安卓6.0 文件存储权限管理
- 安卓6.0 文件存储权限管理
- 安卓文件存储权限管理三种目录
- 安卓文件存储
- Android 7.0文件权限变更(下载,拍照等)
- 安卓文件权限修改
- 安卓的文件存储
- 安卓数据存储1--文件存储
- 修改安卓文件的权限
- 安卓开发-文件读写权限
- 安卓——文件存储
- 安卓文件存储的小小总结
- 安卓文件存储使用参考
- [安卓基础]数据存储之文件
- 安卓文件图片存储工具类
- 安卓文件存储的实现
- 安卓007移动存储--文件
- react native入门
- HDU 1269 迷宫城堡(Tarjan or Kosaraju模板)
- 阻塞IO、非阻塞IO、同步IO、异步IO && Reactor模式
- Lombok 安装、入门
- gbk转utf8 乱码问题
- 安卓7.0文件存储权限变更
- mtk 平台 CAMERA 驱动浅析
- 这些人都在使用超级表格
- ListView 侧滑删除
- vue的单向数据流和双向绑定解释
- BZOJ 3123 LCA + 主席树 + 启发式合并
- 【SoapUI】2、SoapUI进行API Mock测试分析
- 字符串排序
- 变量本质分析