Qt for Android 动态申请权限
2018-07-30 本文已影响42人
蓝点工坊
一.Android 6.0权限机制
在Android 6.0 关在AndroidManifest.xml 静态申请权限不够.
需要运行时,用代码申请才能打开相应权限.
否则只让用户手动在设置找到应用打开相应权限,才能工作.体验非常之差.
比如蓝牙程序在6.0必须有定位权限的才能打开,但是Qt Android的动态申请定位权限请求时灵时不灵,有时运行很长时间均请求.
原生java 动态请求代码很容易,但Qt 需要处理工作
二.解决办法
参考 https://blog.csdn.net/zdc9023/article/details/79209297
https://bugreports.qt.io/browse/QTBUG-50759
如果是Qt 5.10 以前版本需要加入如下补丁
需下载如下 https://bugreports.qt.io/secure/attachment/65420/permission_patch_5_9.zip
第一步:
在项目的pro文件中
QT += androidextras
QT += core-private
#Qt 5.10以上版本不需要加入这两个文件
HEADERS += permissions.h
SOURCES += permissions.cpp
第二步:添加工具类文件
Qt 5.10 版本以下才需要
permissions.cpp/h 加入项目
代码处理
#include <QtAndroid>
bool BT8510Device::checkPermission(const QString &permission)
{
#ifdef Q_OS_ANDROID
QtAndroid::PermissionResult r = QtAndroid::checkPermission(permission);
if(r != QtAndroid::PermissionResult::Granted) {
QtAndroid::requestPermissionsSync( QStringList() << permission );
r = QtAndroid::checkPermission(permission);
if(r == QtAndroid::PermissionResult::Denied) {
return false;
}
}
#else
return true;
#endif
其中permssion 权限来自于Android 定义字符串,需要一查即知
如果
#define ACCESS_COARSE_LOCATION "android.permission.ACCESS_COARSE_LOCATION"
#define WRITE_EXTERNAL_STORAGE
"android.permission.WRITE_EXTERNAL_STORAGE"