发布:2021/10/26 16:41:04作者:管理员 来源:本站 浏览次数:1146
Android 7.0到来后,为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式,
在接收方访问时会触发SecurityException的异常。
因此在提供文件给第三方应用访问时,我们就会用到FileProvider。
FileProvider使用方法:
1.在AndroidManifest.xml里声明Provider
复制代码
<application android:label="AppTest.Android">
<provider android:name="android.support.v4.content.FileProvider"
android:authorities="应用包名.fileprovider"
android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
</provider>
</application>
复制代码
注意:其中android:authorities="应用包名.fileprovider" 如下使用最好android:authorities="${applicationId}.fileprovider",这样可以跟随包名变化。
2. 配置FileProvider文件共享的路径
复制代码
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path name="root" path="" />
<files-path name="files" path="" />
<cache-path name="cache" path="" />
<external-path name="external" path="" />
<external-files-path name="name" path="path" />
<external-cache-path name="name" path="path" />
</paths>
复制代码
说明:
在paths节点内部支持以下几个子节点,分别为:
<root-path/> 代表设备的根目录new File("/");
<files-path/> 代表context.getFilesDir()
<cache-path/> 代表context.getCacheDir()
<external-path/> 代表Environment.getExternalStorageDirectory()
<external-files-path> 代表context.getExternalFilesDirs()
<external-cache-path> 代表getExternalCacheDirs()
3. 配置完共享地址后,获取content uri的值,这个uri即提供给第三方进行访问的uri地址
例子为打开文件代码:
复制代码
public void OpenFile(string path)
{
var context = Android.App.Application.Context;
try
{
if (File.Exists(path))
{
var file = new Java.IO.File(path);
var provider = context.PackageName + ".fileprovider";
var uri = FileProvider.GetUriForFile(context, provider, file);
Intent intent = new Intent(Intent.ActionView);
intent.SetData(uri);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
intent.AddFlags(ActivityFlags.GrantWriteUriPermission);
Intent targetIntent = Intent.CreateChooser(intent, "打开文件");
targetIntent.SetFlags(ActivityFlags.NewTask);
context.StartActivity(targetIntent);
}
}
catch(Exception e)
{
System.Diagnostics.Debug.WriteLine("OpenFile === " + e.Message);
}
}
复制代码
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4