解决 Android 7.0 共享文件上 报错:android.os.FileUriExposedException

前言:由于公司前app项目原来运行sdk版本设定23,为了迎合谷歌上架,版本提升28,所有就有了各种坑! 直接上代码

出错代码

出错代码

出错日志
 //以下是error  info
 Process: xingencom.easypermissiondemo, PID: 3322
        android.os.FileUriExposedException: 

       file:///storage/emulated/0/Android/data/xingencom.easypermissiondemo/files/Pictures/e3dddc5f1ee3e1db580e8f4b5d68d2ba.png  
       exposed beyond app through ClipData.Item.getUri()

        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
        at android.net.Uri.checkFileUriExposed(Uri.java:2346)
--------------------- 

原因:
在应用间共享文件

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅共享文件:Android7.0行为变更

解决方法(二种):

我所采用最简单,最能解决问题的方式:

case 1:
	在自定义的Application中的Create方法添加
package shix.camerap2p.ceqclient.mvp.common;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.StrictMode;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
 * 一个链表来存放所有创建了的activity。而在退出时将链表中的activity全部finish(),实现了完全退出功能
 */
public class ExitApplication extends Application {

    private static final String TAG = "ExitApplication";

    private List<Activity> mActivityList;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
        mActivityList = new ArrayList<>();
        /*解决7.0手机以上不能使用 file://共享问题*/
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        builder.detectFileUriExposure();
        StrictMode.setVmPolicy(builder.build());
    }

    private static ExitApplication ea;

    public ExitApplication() {

    }

    public static ExitApplication getInstance() {
        if (null == ea) {
            ea = new ExitApplication();
        }
        return ea;
    }

    public void addActivity(Activity activity) {
        //为了避免重复添加
        if (mActivityList != null && !mActivityList.contains(activity)) {
            mActivityList.add(activity);
        }
    }


    public void removeActivity(Activity activity) {
        //判断当前集合是否存在该Activity
        if (mActivityList.contains(activity)) {
            mActivityList.remove(activity);
            if (activity != null) {
                activity.finish();
            }
        }
    }


    public void removeAllActivity() {
        //循环将所有的activity全部销毁
        if (mActivityList != null) {
            for (Activity activity : mActivityList) {
                if (activity != null) {
                    activity.finish();
                }
            }
        }
        //杀死应用进程
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

在清单文件AndroidManifest.xml中添加,我的红色不要在意;红色不要在意

case 2:

只有地址:[没有实践,但是看stackoverflow上很多人用这种方式]https://blog.csdn.net/hexingen/article/details/78505582

结语:无论生活如何,爱家人,爱朋友,珍惜自己!喜欢就点个赞!有问题欢迎指点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值