错误信息:
432 3719-3719/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.kingbright.machine_state, PID: 3719
android.os.FileUriExposedException: file:///storage/emulated/0/machineStateDownload/2.apk exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1814)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8970)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8931)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519)
at android.app.Activity.startActivityForResult(Activity.java:4227)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at android.app.Activity.startActivityForResult(Activity.java:4185)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
at android.app.Activity.startActivity(Activity.java:4524)
at android.app.Activity.startActivity(Activity.java:4492)
at com.kingbright.machine_state.MainActivity.installAPK(MainActivity.java:373)
at com.kingbright.machine_state.MainActivity$1.handleMessage(MainActivity.java:98)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6297)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 表示系统根目录/-->
<root-path name="myroot" path="." />
</paths>
AndroidManifest.xml
<provider
android:authorities="com.kingbright.machine_state.provider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
main.java
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data;
// "application/vnd.android.package-archive"是文件类型,具体对应apk类型。
String type = "application/vnd.android.package-archive";
// 用于解决android 7.0 无法弹出安装对话框的问题
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
data = Uri.fromFile(apkFile);
}
else{//android 7.0 及以上版本
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
String authority = "com.kingbright.machine_state.provider";
data = FileProvider.getUriForFile(mContext, authority, apkFile);
}
intent.setDataAndType(data, type); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;
MainActivity.this.startActivity(intent); //弹出一个安装对话框