前言:由于公司前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