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"
上一篇下一篇

猜你喜欢

热点阅读