前言
因项目需要,需要在鸿蒙系统下实现自动升级功能,应用程序使用的是Qt for android开发,因此只要实现android下的apk安装就可以了。网上资料不少,但真正可以用的不多,大部分资料还有些过时了。
本次文档,记录通过jni进行APK文件安装
一、实现方法
Qt使用jni安装的原理基本相同,实现方法主要分如下两种:
1.使用jni直接调用已写好的java代码
2.使用jni直接调用java接口
两者需要了解下java相关的代码,后者要求更高一点,每一步操作,都要经过jni。前者需要额外编写java代码,后者直接在C++中调用即可
笔者本次使用的是后者,我们看下如何实现
二、新建Qt项目
本文档着重实现apk安装,因此非相关部分,就不详细介绍了
1.新建一个Qt Quick项目
2.项目文件添加androidextras模块
3.编写工具类Tool,并将实例注册到qml上下文中
4.qml界面放入一个Label和一个Button,并实现调用工具类Tool的installApk()函数
5.生成android相关配置文件
三、修改AndroidManifest ,注册FileProvider
1.修改包名Package name
此步非必要,但建议读者实际使用时,修改成自己的
2.添加权限Permissions
权限代码添加如下
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
...>
...
</application>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
(1)android.permission.REQUEST_INSTALL_PACKAGES
这个权限在下拉菜单中,是找不到的,需要手工添加到AndroidManifest.xml中
Android7.0引入“私有目录被限制访问”,“StrictMode API 政策”。
targetsdkversion大于25(android 7.1.1及以上),必须声明REQUEST_INSTALL_PACKAGES权限,见官方说明
(2)android.permission.READ_EXTERNAL_STORAGE
若android版本在6.0及以上,可以不用添加。因为从Android6.0开始,引入的动态权限控制(Runtime Permissions),需要运行时,实时获取才行。
3.添加FileProvider
若android版本在7.0及以上,必须要注册FileProvider
添加如下代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
...>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="edu.xidianqd.updatefileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
andro