前言
Qt 随着版本的不断更新,提供了越来越多的接口用于移动端的开发,这里要说的是关于 Android 上权限动态申请的问题,直接在 C++端调用 Qt 的接口即可以实现。
正文
Qt 申请Android 权限的类是在 QtAndroid 中,要使用该类,首先需要在工程文件中声明该模块
QT += androidextras
接下来看看动态获取权限的接口。
接口
void QtAndroid::requestPermissions(const QStringList &permissions, const QtAndroid::PermissionResultCallback &callbackFunc)
Asynchronously requests permissions to be granted to this application, callbackFunc will be called with the results.
This function was introduced in Qt 5.10.
QtAndroid::PermissionResultMap QtAndroid::requestPermissionsSync(const QStringList &permissions, int timeoutMs = INT_MAX)
Synchronously requests permissions to be granted to this application, waits timeoutMs to complete.
This function was introduced in Qt 5.10.
这两个接口,一个是异步一个是同步,使用方法有些不一样。需要注意的是,这个接口是从 Qt5.10才开始支持的,所以 Qt 版本必须要在5.10以上才能用。
使用方法
这里举例申请摄像头权限的方法:
bool Manager::requestPermission() {
QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.CAMERA");
if(r == QtAndroid::PermissionResult::Denied) {
QtAndroid::requestPermissionsSync( QStringList() << "android.permission.CAMERA" );
r = QtAndroid::checkPermission("android.permission.CAMERA");
if(r == QtAndroid::PermissionResult::Denied) {
return false;
}
}
return true;
}
申请其他权限大同小异,只需要修改权限名就可以了。
为什么要手动申请权限?
可能有人会觉得奇怪,为什么会有这个问题?因为通常做 android 开发我们都知道,要使用这种敏感权限必须要先申请才能用,那么在 android 原生开发里面,需要在 AndroidMenifest.xml中添加相应的权限才行。早期的Qt 版本开发 Android 应用时也需要这样做才行,要不然功能无法实现。
但是,最近在调试权限的问题时发现一个非常奇怪的事情,我使用 Qt5.11.0版本进行开发,在 QML 中直接调用 Camera 打开摄像头,根本无需像以前那样需要先在AndroidMenifest.xml添加相机权限,直接用就可以了,貌似在调用 Camera 的时候,底层已经默认会去自动申请了,无需手动再申请。
那可能有人会说,既然底层会自动申请了为啥还要动态去申请权限呢?
我测试过程中发现,如果不手动去申请权限,在我的 Android8.0手机上,,直接调用 Camera 时,会自动弹出权限申请框,点击权限允许过后,进入到 Camera 发现摄像头预览页面并没有画面,完全是空白。我猜测这里是跟系统调用的顺序有关,申请权限比打开页面慢 所以导致摄像头预览没有加载出来。所以这时候就需要先手动去申请权限,然后在打开摄像头页面即可解决问题。
关于这部分的解释,后期会单独写篇文章介绍,Android权限的申请其实还有好多很奇怪的现象,相比以前 Qt 老版本,新版的更新确实带来了不少改进,为开发者减少了很多工作量。