Android 7.0 应用间文件访问方法(FileProvider)

在安卓7.0以前,应用之间的文件共享可通过intent+”file:// Uri” 的形式进行访问(代码如下),但在安卓N之后,便收回了文件访问的权限,若要在应用间建立临时文件共享,必须通过FileProvider类来进行操作,使用FileProvider类生成content:// Uri来替代file:// Uri;

本文为大家提供两种解决方案,第一种相对麻烦一点,需要自己配置各种文件,第二种是直接引用库文件,仅需一行代码即可搞定;


安卓版本<N

        //APK升级
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
        mContext.startActivity(i);

异常

android.os.FileUriExposedException: file:///mnt/sdcard/XXX/XXX.apk exposed beyond app through Intent.getData()

安卓版本>=N

首先在配置文件中声明:

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            ...
        </provider>
        ...
    </application>
</manifest>

。 android:name 固定写法。
。 android:authorities 可自定义,最好使用包名来区分
。 android:exported 必须设置成 false,否则运行时会报错java.lang.SecurityException: Provider must not be exported 。
。 android:grantUriPermissions 共享文件访问权限。
。 节点中的android:resource指定了共享文件的路径

file_paths:file_paths即是该Provider对外提供文件的目录的配置文件,存放在res/xml/下

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    ...
</paths>

内部节点:

//getFilesDir()
<files-path name="name" path="path" />

//getCacheDir()
<cache-path name="name" path="path" />

//Environment.getExternalStorageDirectory()
<external-path name="name" path="path" />

//getExternalFilesDir()
<external-files-path name="name" path="path" />

//getExternalCacheDir()
<external-cache-path name="name" path="path" />

兼容后的代码:

        //APK升级
        Intent i = new Intent(Intent.ACTION_VIEW);
        Uri uri;
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // 判断版本大于6.0
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {

            uri = FileProvider.getUriForFile(mContext,"配置文件的authorities",new File("file://" + apkfile.toString()));

        }else {

            uri = Uri.parse("file://" + apkfile.toString());

        }

        i.setDataAndType(uri, "application/vnd.android.package-archive");

        mContext.startActivity(i);

还有一种更简便的方法是直接使用库,仅一行代码即可,不需要额外对配置文件进行修改,也不用新建XML文件:

在配置中引入:compile 'com.zhy.base:fileprovider:1.0.0'

代码:

            Intent intent = new Intent(Intent.ACTION_VIEW);
            //APKfile为你的安装包文件url
            FileProvider7.setIntentDataAndType(mContext,intent, "application/vnd.android.package-archive", apkfile, true);
            mContext.startActivity(intent);

不过在使用库之后在编译时遇到一个bug,无法通过,不知道是不是因为库文件引起的:Error:Execution failed for task ‘:app:incrementalDebugJavaCompilationSafegua

以下为两个解决办法:

1.在项目配置中将API升级至7.0
2.在引入库文件时将compile改为provided

0.0


官方文档:
https://developer.android.google.cn/reference/android/support/v4/content/FileProvider.html

FileProvider详解:
http://blog.csdn.net/lmj623565791/article/details/72859156

FileProvider库:
https://github.com/hongyangAndroid/FitAndroid7

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值