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

提供了onRequestPermissionsResult 用于当用户同意权限或者拒绝权限之后的调用


其实可以想象得到,当申请权限时,需要等待用户点击, 所以这是需要一个过程的。

3. 参考Qt示例中的方式

举例如下, 请求权限, 请求完毕之后再回调init初始化,

下面是一个camera的请求权限示例,当checkPremission函数检查权限完毕之后, 没有权限则调用requestPremission申请权限,申请完毕之后槽函数还是init,再执行checkPremission... , 直到用户同意权限申请。

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#ifdef Q_OS_ANDROID
#include <QPermissions>
#endif

#include <QCameraDevice>
#include <QCamera>
#include <QImageCapture>
#include <QMediaCaptureSession>
#include <QMediaDevices>
#include <QMediaMetaData>
#include <QMediaRecorder>

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();
}
相关推荐
zhangjin11201 小时前
解决Android Studio gradle下载超时和缓慢问题(二)
android·ide·android studio
Highcharts.js6 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员7 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
xingxiliang8 小时前
深入浅出 Android CTS 视频测试:从环境搭建、用例设计到底层通信原理
android·音视频
我命由我123458 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友9 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华9 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.10 小时前
C++:语句和作用域
开发语言·c++
雨白10 小时前
深入理解 Kotlin 协程 (八):拾遗补阙,探秘官方框架的调度细节与取消闭环
android·kotlin
wanderist.11 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法