安卓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结束了,权限赋予会自动移除。

原创粉丝点击