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

相关推荐
恋猫de小郭3 分钟前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech13 分钟前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户20187928316714 分钟前
为何Handler的postDelayed不适合精准定时任务?
android
侃侃_天下14 分钟前
最终的信号类
开发语言·c++·算法
叽哥29 分钟前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
Cui晨29 分钟前
Android RecyclerView展示List<View> Adapter的数据源使用View
android
氦客29 分钟前
Android Doze低电耗休眠模式 与 WorkManager
android·suspend·休眠模式·workmanager·doze·低功耗模式·state_doze
echoarts40 分钟前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
玲珑Felone42 分钟前
从flutter源码看其渲染机制
android·flutter
诺诺Okami43 分钟前
Android Framework-Launcher-数据的加载
android