在网上找了很多适配7.0以上android系统打开文件的解决方法,但都是用java写的,在kotlin中又会碰到其它的问题,而显示kotlin问题方面的信息,根本就没有,在这里记录以下我使用kotlin打开文件是碰到的问题。
在项目中需要更新Apk,在我更新完Apk后,调用java写的工程中的安装方法转换成kotlin代码后,在kotlin项目中,运行安装,一直都是都是屏幕一闪之后,就没反应了,因为刚开始用kotlin,使用不是很熟,查看LogCat模式有错,在这记录遇到的问题及解决方式。
先配置先java的安装Apk的方式,有两种:
1,在你需要的地方,你可以使用如下代码,如果你需要在多个地方打开文件,你可以在Application中配置这个:
//7.0上安装apk报fileUriExposedException
//解决7.0以上传递file://类型uri抛出FileUriExposedException异常
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val builder = StrictMode.VmPolicy.Builder()
StrictMode.setVmPolicy(builder.build())
}
在打开文件可以直接调用最基础的方法,不用适配7.0的问题:
File file =new File(fullPath);
Intent updateApk =new Intent(Intent.ACTION_VIEW);
Uri downloadFileUri = Uri.fromFile(file);
updateApk.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
updateApk.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApplication.getInstance().startActivity(updateApk);
2.就是不使用上面配置的方法,使用FileProvider:
首先在项目的res目录下,创建一个xml文件夹,在里面创建一个file_paths.xml文件,里面内容:
file_paths.png file_paths的内容再在清单文件中配置FileProvider:
File_Provider.png provider的配置在打开文件的时候,需要适配7.0:
//判断是否是AndroidN以及更高的版本
Intent intent =new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(context.getApplicationContext(), BuildConfig.APPLICATION_ID +".fileProvider", file);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
}else {
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
context.startActivity(intent);
在使用java编写工程的时候,打开文件没什么问题,但是在kotlin中,第一种方式没用,第二种方式Apk也安装不了,需要在清单文件中配置权限:
permission.png 权限配置图
网友评论