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>
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);
- }
- }
- View Code
来源: http://www.bubuko.com/infodetail-2520782.html