1,安卓7后不能直接file://访问使用了provider
2,安卓手机安装陌生应用权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.hz.dc.wangjjr.provider" //包名+provider android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path path="." name="awj"/>//根目录的awj文件 </paths>
public static void openFile(Context context, File file){ try { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //设置intent的Action属性 intent.setAction(Intent.ACTION_VIEW); //获取文件file的MIME类型 String type = getMIMEType(file); //设置intent的data和Type属性。android 7.0以上crash,改用provider if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Uri fileUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", file); Uri fileUri = FileProvider.getUriForFile(context, "com.hz.dc.wangjjr.provider", file);//android 7.0以上 intent.setDataAndType(fileUri, type); grantUriPermission(context, fileUri, intent); }else { intent.setDataAndType(/*uri*/Uri.fromFile(file), type); } //跳转 context.startActivity(intent); }catch (Exception e){ e.printStackTrace(); // showAlert(context, "File corrupted, download again please."); } } private static void grantUriPermission (Context context, Uri fileUri, Intent intent) { List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } }
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path path="." name="awj"/> </paths>