Qt for android :解决requestperssion后无法马上访问设备的问题

描述

当需要访问到设备硬件时, 涉及到Android权限,所以需要进行权限申请, 申请完之后访问常常发现权限不足, 为什么呢?

1. 从Qt库角度看问题:

无论是 QCoreApplication::requestPermission

since 6.5\] template void QCoreApplication::requestPermission(const QPermission \&permission, Functor \&\&functor) **还是 QtAndroidPrivate::requestPermission** QFutureQtAndroidPrivate::PermissionResult QtAndroidPrivate::requestPermission(const QString \&permission) 从官方库接口定义来说 权限请求都是异步的,或者QFuture或者设置槽函数。 ### 2. Android 开发文档 [requestPremission](https://developer.android.google.cn/reference/android/app/Activity#requestPermissions%28java.lang.String%5B%5D,%20int,%20int%29) 提供了onRequestPermissionsResult 用于当用户同意权限或者拒绝权限之后的调用 *** ** * ** *** 其实可以想象得到,当申请权限时,需要等待用户点击, 所以这是需要一个过程的。 ### 3. 参考Qt示例中的方式 举例如下, 请求权限, 请求完毕之后再回调init初始化, 下面是一个camera的请求权限示例,当checkPremission函数检查权限完毕之后, 没有权限则调用requestPremission申请权限,申请完毕之后槽函数还是init,再执行checkPremission... , 直到用户同意权限申请。 ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #ifdef Q_OS_ANDROID #include #endif #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); init(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::init() { #ifdef Q_OS_ANDROID QCameraPermission cameraPermission; switch (qApp->checkPermission(cameraPermission)) { case Qt::PermissionStatus::Undetermined: qApp->requestPermission(cameraPermission, this, &MainWindow::init); qDebug() << "requestPermission..."; return; case Qt::PermissionStatus::Denied: qWarning("Camera permission is not granted!"); return; case Qt::PermissionStatus::Granted: break; } #endif setCamera(QMediaDevices::defaultVideoInput()); } void MainWindow::setCamera(const QCameraDevice &cameraDevice) { m_camera.reset(new QCamera(cameraDevice)); m_captureSession.setCamera(m_camera.data()); connect(m_camera.data(), &QCamera::activeChanged, this, [=]() { qDebug().noquote() << "[camera] activeChanged"; }); connect(m_camera.data(), &QCamera::errorOccurred, this, [=]() { qDebug().noquote() << "[camera] errorOccurred: " << m_camera->errorString(); }); if (!m_imageCapture) { m_imageCapture.reset(new QImageCapture); m_captureSession.setImageCapture(m_imageCapture.get()); connect(m_imageCapture.get(), &QImageCapture::readyForCaptureChanged, this, [=]() { qDebug().noquote() << "[imageCapture] readyForCaptureChanged"; }); connect(m_imageCapture.get(), &QImageCapture::imageCaptured, this, [=]() { qDebug().noquote() << "[imageCapture] imageCaptured"; }); connect(m_imageCapture.get(), &QImageCapture::imageSaved, this, [=]() { qDebug().noquote() << "[imageCapture] imageSaved"; }); connect(m_imageCapture.get(), &QImageCapture::errorOccurred, this, [=]() { qDebug().noquote() << "[imageCapture] errorOccurred: " << m_imageCapture->errorString() ; }); } m_captureSession.setVideoOutput(ui->videoWidget); m_camera->start(); } ```

相关推荐
奔波霸的伶俐虫43 分钟前
jeecg框架@Dict不生效问题
开发语言·python
YY_TJJ2 小时前
8.4 Java Web(Maven P50-P57)
java·开发语言·maven
安卓开发者3 小时前
Android JUnit 测试框架详解:从基础到高级实践
android·junit·sqlserver
hcgeng3 小时前
如何在Android中创建自定义键盘布局
android·keyboard
Jomurphys3 小时前
Android 优化 - 日志 Log
android
pusue_the_sun3 小时前
从零开始搞定类与对象(中)
开发语言·c++·学习
huxiao_06013 小时前
如何手动打包 Linux(麒麟系统)的 Qt 程序
linux·qt
咕噜咕噜啦啦3 小时前
Qt按键响应
开发语言·qt
raoxiaoya3 小时前
Golang中的`io.Copy()`使用场景
开发语言·后端·golang
屁股割了还要学3 小时前
【数据结构入门】链表
c语言·开发语言·数据结构·c++·学习·算法·链表