Andrioid FileProvider在Xamarin.Forms中的使用

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);
            }
        }                    

原文地址:https://www.cnblogs.com/devin_zhou/p/8520706.html

时间: 2024-10-08 18:18:15

Andrioid FileProvider在Xamarin.Forms中的使用的相关文章

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的:iOS的活动指示器是灰色的:Windows Phone的活动指示器是蓝色的.如果开发者想要让各个平台下活动指示器的颜色统一,可以使用ActivityIndicator定义的Color属性,其语法形式如下: <ActivityIndicator Color="activityIndicatorC

Xamarin.Forms中DependencyService的使用

Xamarin.Forms中DependencyService的使用 在Xamarin.Forms中,我们经常会根据各个平台的特性特殊处理一些需求,比如:读取应用的版本号. 在此也以读取应用版本号为例,练习DependencyService用法: 创建IPlatformInfoService接口: 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace XFPractice.Se

Xamarin.Forms中实现CheckBox控件

Xamarin.Forms中实现CheckBox控件 由于Xamarin.Forms中没有Checkbox这个基础控件,我们就只能自己来实现啦! 这里采用的是继承Image来实现Checkbox控件,代码如下所示: IconUnChecked :未选中状态的图片名称 IconChecked:选中状态的图片名称 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装

Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装 在移动应用开发中,经常需要判断一个app是否安装,iOS中有什么方式可以判断app是否安装呢? 这里介绍通过Url Scheme来判断应用是否安装. Url Scheme在这里就不详讲了,可以看文章URL Schemes 使用详解. 首先我们来看看在原生iOS开发中Objective-C如何编写判断代码: if ([[UIApplication sharedApplication] canOpenURL:[NSURL

xamarin forms中的Button文本默认大写

问题来源 使用xamarin forms创建的android项目中,Button.Toolbar的右侧菜单按钮上的如果是字母的话,在android5.0以上,默认的文本都是大写,这种情况iOS项目不存在,是正常的显示.google公司把android的文本默认大写,这个肯定和英语国家阅读习惯有关,但是iOS却是正常显示,有点难以解释google为什么将android的按钮文本默认成大写.问题如图: 分析 其实这个问题的产生的原因还是因为 在5.0中在Button使用的Theme是这个,默认已经t

Xamarin.Forms中 Navigation,NavigationPage详解

1.Xamarin Forms下有四个成员类:Element,VisualElement,Page,NavigationPage 基类为Element,继承的子类分别是VisualElement,Page,NavigationPage. 2.Navigation 为VisualElement的一个成员对象,该对象是INavigation接口类型的. 3.INavigation接口中有5个方法,如下 namespace Xamarin.Forms { public interface INavig

Xamarin.Forms中为WebView指定数据来源Source

网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebView从数据来源读取内容,并进行显示.WebView支持三种数据来源,分别为网站的网页.HTML代码和本地HTML文件.这三种形式都通过Source属性进行设置.在设置这三种形式来源,需要注意以下问题: 第一,使用网站网页,需要指定该网页的完整路径,包括http://或者https://部分. 第二,使用HTML代码,需要将该内容保存为一个字符串.在赋值的时候,使用@符号标

张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )

所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色的矩形用来表示 ListView 的选中.如下图 但怎样通过 Xamarin.Forms ,将这一样式的汉堡菜单带入到 Android 与 iOS 中呢? 一.大纲-细节模式简介 讲代码前首先来说说这种导航模式,官方称"大纲-细节模式"(MasterDetail).左侧的汉堡菜单称为&qu

Xamarin.Forms之MessagingCenter

MessagingCenter是Xamarin.Forms中很有用但是很难用的东西,使用起来很方便,但是要注意的地方很多 1.Sender能为空 MessagingCenter.Send<CacheUserInfo>(UserInfo.Instance.CurrentLoginUser, "UpdateMenuIconList"); CurrentLoginUser为空的时候,会直接造成界面卡死(不执行下面的代码,但是也不报错,坑爹的地方)