少年乘勇气,百战过乌孙。这篇文章主要讲述Android 在代码中安装 APK 文件相关的知识,希望能为你提供帮助。
废话不说,上代码
private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File apkFile = new File(filePath); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT > = Build.VERSION_CODES.N) { Log.w(TAG, "版本大于 N ,开始使用 fileProvider 进行安装"); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile( mContext , "你的包名.fileprovider" , apkFile); intent.setDataAndType(contentUri, "application/vnd.android.package-archive"); } else { Log.w(TAG, "正常进行安装"); intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } startActivity(intent); }
代码说明关于在代码中安装 APK 文件,在 Android N 以后,为了安卓系统为了安全考虑,不能直接访问软件,需要使用 fileprovider 机制来访问、打开 APK 文件。
【Android 在代码中安装 APK 文件】上面的 if 语句,就是区分软件运行平台,来对 intent 设置不同的属性。
适配 Android 各个版本,使用代码安装 APK 第一步:
在清单文件(manifests.xml)application 标签中增加 < provider> 标签:
< application> < !--其他的配置项--> < provider android:name="android.support.v4.content.FileProvider" android:authorities="你的包名.fileprovider" android:exported="false" android:grantUriPermissions="true"> < meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> < /provider> < !--其他的配置项--> < /application>
注意两点内容:
1. android:authorities="你的包名.fileprovider" 这个属性要设置成你自己的包名。
2. < meta-data> 标签下 android:resource="@xml/file_paths" 是要配置的 xml 文件,他的内容如下:
第二步:
在 res/xml 下增加文件: file_paths.xml 该文件内容如下:
< ?xml version="1.0" encoding="utf-8"?> < paths> < external-path name="your_name" path="your_path" /> < /paths>
上面的两个属性要根据自己的使用来配置。
其中 < external-path> 就是手机的外置存储目录。
第三步:
在 java 代码中使用最上面的代码,问题解决。
这里面有个要注意的点:
清单文件中的 android:authorities="你的包名.fileprovider" 和
Uri contentUri = FileProvider.getUriForFile( mContext , "你的包名.fileprovider" , apkFile);
中绿色背景的字段必须一致,否则会报错。
推荐阅读
- Android support 26.0.0-alpha1 产生的问题 (复制的)
- android 性能測试CTS篇
- Android 面试之横竖屏切换的Activity生命周期
- R语言中apply函数
- Android真机调试访问本地服务器(localhost)的解决方案
- Android开发-状态栏着色原理和API版本号兼容处理
- 我的Android进阶之旅------&gt;MIME类型大全
- Qt for Android 开发大坑
- POJ 3321 Apple Tree