Qt安卓开发经验021-030
关于权限设置,在早期的安卓版本,所有权限都写在全局配置文件AndroidManifest.xml中,这种叫安装时权限,就是安装的时候告诉安卓系统当前app需要哪些权限。大概从安卓6开始,部分权限需要动态申请,这种叫动态权限,这种申请到的权限也可以动态撤销,就是要求程序再次执行代码去向系统申请权限,比如拍照、存储读写等。也不是所有的权限都改成了动态申请,意味着兼容安卓6以上的系统你既要在AndroidManifest.xml中写上要求的权限,也要通过checkPermission申请你需要的权限。
android studio 新建并生产jar包步骤。
- 第一步:文件(File)-》新建(new)-》项目(new project)-》空白窗体(empty activity)。
- 第二步:刚才新建好的项目鼠标右键新建(new)-》模块(new module)-》安卓库(android library)。
- 说明:如果选择的不是安卓库(android library)而是java库(Java Library),则直接编译出来的就是jar文件,默认包名 com.example.lib.MyClass。推荐选择java库,编译后不用去一堆文件中找jar文件。
- 第三步:写好库名字,根据项目需要选择好最低sdk版本-》完成。
- 第四步:在刚才新建好的库项目mylibrary,依次找到子节点src/main/java/com.example.mylibrary上鼠标右键新建-》class类。切记是这个节点不是java节点或者其他节点。
- 第五步:写好你的类方法函数等。
package com.example.mylibrary;
public class Test {
public static int add(int a, int b) {
return a + b;
}
}
- 第六步:选中库项目mylibrary,菜单执行编译(build)-》编译库(make module xxx)。
- 第七步:此时在mylibrary/build目录下有outputs目录和intermediates目录,其中outputs/aar目录下是生成的Android库项目的二进制归档文件,包含所有资源,class以及res资源文件全部包含。有时候我们仅仅需要jar文件,只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。需要到intermediates/aar_main_jar/debug目录下,可以看到classes.jar,将这个拷贝出来使用即可。当然你也可以对刚才的aar文件用解压缩软件解压出来也能看到classes.jar,是同一个文件。
- 其他:调用jar包非常简单,只需要将jar文件放在你的项目的libs目录下即可,对应的包名和函数一般jar包提供者会提供,没有提供的话,可以在android studio中新建空白项目,切换到project视图,找到libs目录,鼠标右键最下面作为包动态库添加到项目,导入包完成以后会自动在libs目录列出,双击刚刚导入的包然后就自动列出对应的类和函数。
- Qt安卓使用jar包步骤。
- 第一步:将classes.jar放到android/libs目录下,为啥是这个目录?因为这是安卓的规则约定,这个目录就是放库文件,放在这个目录下的文件会自动打包编译到apk文件中。
- 第二步:调用jar文件之前,前提是你知道jar文件中的函数详细信息,这个一般jar提供者会提供好手册,如果代码没有混肴的话,你可以在android studio中双击打开查阅具体的函数。
- 第三步:如果jar文件中的函数简单,直接拿到结果不需要绕来绕去,可以直接写Qt类来调用;如果还是很复杂,建议再去新建java类处理完再交给Qt,当然也可以让jar的作者尽可能封装函数的时候就做好,尽量提供最简单的接口返回需要的数据。比如返回图片数据可以做成jar内部存储好图片,然后返回图片路径即可,不然有些数据转换也挺烦。
- 第四步:编写最终的调用函数。
int AndroidJar::add(int a, int b)
{
#ifdef Q_OS_ANDROID
const char *className = "com/example/mylibrary/Test";
jint result = QAndroidJniObject::callStaticMethod<jint>(className, "add", "(II)I", (jint)a, (jint)b);
return result;
#endif
}
- Qt6中对安卓支持部分做了大的改动,目前还不完善,如果是不涉及到与java交互的纯Qt项目,可以正常移植,涉及到的暂时不建议移植到Qt6,等所有类完善了再说。
- 移除了安卓插件androidextras,将其中部分功能类移到core模块中,不需要额外引入。
- 类名发生了变化,比如QAndroidJniObject改成了QJniObject、QAndroidJniEnvironment改成了QJniEnvironment,可能是为了统一移动开发平台类,弱化安卓的影响。
- 对应的安卓jdk要用jdk11而不是jdk1.8,Qt5.15两个都支持,建议就统一用jdk11。
- 对应封装的java类包名去掉了qt5标识,org.qtproject.qt5.android.bindings.QtActivity改成了org.qtproject.qt.android.bindings.QtActivity、org.qtproject.qt5.android.bindings.QtApplication改成了org.qtproject.qt.android.bindings.QtApplication。
- 对安卓最低sdk有要求,所以建议在配置AndroidManifest.xml文件的时候不要带上最低版本要求。
- 对AndroidManifest.xml文件内容有要求,之前Qt5安卓的不能在Qt6安卓下使用,具体内容参见示例下的文件。
- 对应示例demo在 C:\Qt\Examples\Qt-6.3.0\corelib\platform 目录下,之前是 C:\Qt\Examples\Qt-5.15.2\androidextras ,目前就一个示例,可能因为其他类还没有移植好。
如果想要安卓全屏遮挡住顶部状态栏,可以在main函数中将show改成showFullScreen即可,当然也可以采用java的方式在onCreate函数中加一行 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
横竖屏切换的识别,在Qt中会同时反映到resizeEvent事件中,你可以在这个是尺寸变化后读取下当前屏幕是横屏还是竖屏,然后界面上做出调整,比如上下排列改成左右排列。
由于不同Qt版本对应的安卓配置文件 AndroidManifest.xml 内容格式不一样,高版本和低版本模板格式互不兼容,所以建议使用自己的Qt版本创建的 AndroidManifest.xml 文件,创建好以后如果使用的是自己重新定义的java文件的启动窗体则需要将 AndroidManifest.xml 文件中的 android:name="org.qtproject.qt5.android.bindings.QtActivity" 换掉就行。
如果自己用android studio编译的jar文件放到Qt项目的libs目录下,导致编译通不过,提示 com.android.dx.cf.iface.ParseException: bad class file magic 之类的,那是因为jdk版本不一致导致的,你可能需要在android studio项目中找到模块编jdk版本设置的地方降低版本,比如你用的ndk是r14,则需要选择jdk1.6或者jdk1.7。一般来说高版本兼容低版本,因为ndk版本太低无法兼容jdk1.8。后面发现如果直接新建的是java库(Java Library)则不存在这个问题,如果选择的是安卓库(android library)就可能有这个问题。
安卓项目配置文件是固定的名字 AndroidManifest.xml ,改成其他名字就不认识,不要想当然改成其他名字导致无法正常识别。
AndroidManifest.xml文件中的package="org.qtproject.example"是包名,也是整个apk程序的内部唯一标识,如果多个apk这个包名一样,则会覆盖,所以一定要注意不同的程序记得把这个包名改成你自己的。这个包名也决定了java文件中需要使用资源文件时候的引入包名 import org.qtproject.example.R; 如果包名不一样则编译都通不过。
安卓综合应用示例 https://qtchina.blog.csdn.net/article/details/123940153

Qt安卓开发经验021-030的更多相关文章
- 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)
除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...
- 涛哥:Qt安卓-5.12环境搭建
简介 Qt for android 环境搭建,以Windows平台 Qt5.12为基准. 因为有不少人问相关问题,所以写篇文章汇总一下. 安装Qt 需要先安装Android版的Qt. 一般在Qt的安装 ...
- 【转】安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少
本文由 ImportNew - 唐尤华 翻译自 gigavoice.如需转载本文,请先参见文章末尾处的转载要求. 除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的 ...
- QT 安卓 悬浮窗权限动态申请
一:申请方式: String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.action.MANAGE_OVERLAY_PERMI ...
- QT 安卓 调用java类
用以下方式即可调用java类中的方法 QAndroidJniObject activity = QtAndroid::androidActivity(); QAndroidJniObject Devi ...
- QT 安卓动态获取权限
一:在AndroidManifest.xml文件中赋予相关权限 二: package ckdz.Appproject; import android.Manifest; import android. ...
- 采访Philipp Crocoll:安卓平台上整合Java和C#
在这个采访中,我们跟开源开发者Philipp Crocoll讨论了关于Keepass2Android的相关话题.Keepass2Android不仅具有强大的密码存储的功能,还是在一个单独的安卓应用同时 ...
- Qt for Android 开发大坑
Qt for Android 开发大坑 作者: qyvlik Qt 5.5.1 这里说一说比較常见的 Qt 开发安卓的大坑. 希望同学们不要做无谓的挣扎,跳过这些坑. 输入框 首当其冲的是输入框,Qt ...
- Android | 带你零代码实现安卓扫码功能
目录 小序 背景介绍 前期准备 开始搬运 结语 小序 这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音-- ...
- 马上学Android开发在线视频教程全集
马上学Android开发视频教程全集 马上学Android开发[马上学Android]安卓开发视频教程 001 Androi 马上学Android开发[马上学Android]安卓开发视频教程 002 ...
随机推荐
- kotlin类和对象—>接口
1.接口定义,使用关键字interface 来定义接口 interface MyInterface { fun bar() fun foo() { // 可选的方法体 } } 2.实现接口,一个类和对 ...
- k8s的pod的理解
pod共享相同的IP地址和端口空间. 这意味着在同一 pod中的容器运行的 多个进程需要注意不能绑定到相同的端口号, 否则会导致端口冲突, 但这只涉及同一pod中的容器. 由于每个pod都有独立的端口 ...
- while循环和do循环、缓冲区、一维数组
缓冲区 输入缓冲区 从键盘得到数据的时候用户输入的数据首先进入输入缓冲区,然后程序从输入缓冲区里获得数字,先进入输入缓冲区的数据必须先处理(类似排队),如果先进入输入缓冲区的数据无法处理,程序就得不到 ...
- 重构案例:将纯HTML/JS项目迁移到Webpack
我们已经了解了许多关于 Webpack 的知识,但要完全熟练掌握它并非易事.一个很好的学习方法是通过实际项目练习.当我们对 Webpack 的配置有了足够的理解后,就可以尝试重构一些项目.本次我选择了 ...
- 国产化UOS适配
配置本地iso镜像为apt源 把镜像放到目录下 /home/gaohongyu/debian/uniontechos-server-20-enterprise-1030-arm64.iso 创建目录 ...
- 3. jenkins的管理
1. jenkins的插件管理 Jenkins本身不提供很多功能,我们可以通过使用插件来满足我们的使用.例如从Gitlab拉取代码,使用Maven构建项目等功能需要依靠插件完成.接下来演示如何下载 ...
- Ubuntu 重启后 wifi 图标不见了 连不上网
今天重启了一下电脑,结果wifi图标不见了,打开浏览器,无法联网.想了办法用网线先连上网,去网上找了找,说让我执行 sudo service network-manager restart 但是我执行 ...
- linux history 想显示历史命令的时间和作者
vi ~/.profile 增加 HISTTIMEFORMAT="%F %T `whoami` `who am i|awk '{print $1,$5}'|sed 's/ (/@/'|sed ...
- apisix问题记录
负载均衡 可以给 rest api(9080)做负载均衡 不可以给dashboard做负载均衡,否则会出现闪退,dashboard之间的token并不是通用的 路由导出 openapi 路由导出ope ...
- ArcGIS遥感影像重采样操作及不同算法对比
本文介绍在ArcMap软件中,实现栅格图像重采样的具体操作,以及不同重采样方法的选择依据. 在之前的博客中,我们介绍了基于Python中Arcpy模块对栅格图像加以批量重采样的方法:而在Arc ...