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(); } ```

相关推荐
Ws_2 小时前
C#学习 Day2
开发语言·学习·c#
杰克尼2 小时前
天机学堂复习总结(day03-day04)
java·开发语言·redis·elasticsearch·spring cloud
x***r1512 小时前
jdk-11.0.16.1_windows使用步骤详解(附JDK 11环境变量配置与验证教程)
java·开发语言·windows
luck_bor3 小时前
File类&递归作业
java·开发语言
努力努力再努力wz7 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
rocpp7 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
skywalk81637 小时前
言知(Yanzhi)系统提升建议报告和完工报告 by AutoCoder
开发语言·编程
yunn_7 小时前
单例模式两种实现方法
开发语言·c++·单例模式
我材不敲代码8 小时前
Python基础:列表详解、增删改查及常用高阶操作
开发语言·windows·python
奇树谦8 小时前
QML 开发前端界面详解:从入门到示例实战
qt