美文网首页
Android 7.0 FileProvider使用

Android 7.0 FileProvider使用

作者: _凌浩雨 | 来源:发表于2018-07-19 11:23 被阅读166次
    1). FileProvider

    Android 7.0的新特性规定,对于android 7.0应用(仅仅对于android 7.0版本的sdk而言,若是编译版本低于25仍然不会受到影响),android框架使用StrictMode Api禁止我们的应用对外部(跨越应用分享)公开file://,若使用file://格式共享文件则会报FileUriExposedException异常,android 7.0应用间的文件共享需要使用content://类型的URI分享,并且需要为其提供临时的文件访问权限
    (Intent.FLAG_GRANT_READ_URI_PERMISSION和Intent.FLAG_GRANT_WRITE_URI_PERMISSION),对此,官方给我们的建议是使用FileProvider类进行分享。

    2). 使用步骤
    • manifest中声明FileProvider
    • res/xml中定义对外暴露的文件夹路径
    • 生成content://类型的Uri
    • 给Uri授予临时权限
    • 使用Intent传递Uri
    3). AndroidManifest.xml文件声明
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="<包名>.fileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
          <meta-data
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths"/>
        </provider>
    
    • name:provider的类名,若使用默认的v4的FileProvider可使用”android.support.v4.content.FileProvider”,也可以设置为自定义的继承FileProvider的provider类;
    • authorities:一个签名认证,可以自定义,但在获取uri的时候需要保持一致;
    • grantUriPermissions:使用FileProvider的使用需要我们给流出的URI赋予临时访问权限(READ和WRITE),该设置是允许我们行使该项权力;
    • meta-data:meta-data配置的是我们可以访问的文件的路径配置信息,需要使用xml文件进行配置,FileProvider会通过解析xml文件获取配置项,其中name名字不可改变为:android.support.FILE_PROVIDER_PATHS,resource为配置路径信息的配置项目。
    4). xml配置
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <paths>
        <!-- Context.getFilesDir() + "/path/" -->
        <files-path
            name="my_files"
            path="mazaiting/"/>
        <!-- Context.getCacheDir() + "/path/" -->
        <cache-path
            name="my_cache"
            path="mazaiting/"/>
        <!-- Context.getExternalFilesDir(null) + "/path/" -->
        <external-files-path
            name="external-files-path"
            path="mazaiting/"/>
        <!-- Context.getExternalCacheDir() + "/path/" -->
        <external-cache-path 
             name="name" 
             path="mazaiting/" />
        <!-- Environment.getExternalStorageDirectory() + "/path/" -->
        <external-path
            name="my_external_path"
            path="mazaiting/"/>
        <!-- Environment.getExternalStorageDirectory() + "/path/" -->
        <external-path
            name="files_root"
            path="Android/data/<包名>/"/>
        <!-- path设置为'.'时代表整个存储卡 Environment.getExternalStorageDirectory() + "/path/"   -->
        <external-path
            name="external_storage_root"
            path="."/>
      </paths>
    </resources>
    
    图1.png
    5). 生成Uri
          Uri contentUri = FileProvider.getUriForFile(context,
                  BuildConfig.APPLICATION_ID + ".fileProvider",
                  new File(path));
    
    6). 授予临时权限
          intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    7). 传递
          intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
    
    8). 安装应用代码
    图2.png

    相关文章

      网友评论

          本文标题:Android 7.0 FileProvider使用

          本文链接:https://www.haomeiwen.com/subject/wfozpftx.html