Andrioid FileProvider在Xamarin.Forms中的使用
阿新 • • 發佈:2018-03-09
var mar bug provider 路徑 ech set apk cto
Andrioid FileProvider在Xamarin.Forms中的使用
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
Andrioid FileProvider在Xamarin.Forms中的使用