Qt for Android 动态申请权限
前言
Qt 隨著版本的不斷更新,提供了越來越多的接口用于移動端的開發,這里要說的是關于 Android 上權限動態申請的問題,直接在 C++端調用 Qt 的接口即可以實現。
正文
Qt 申請Android 權限的類是在 QtAndroid 中,要使用該類,首先需要在工程文件中聲明該模塊
QT += androidextras接下來看看動態獲取權限的接口。
接口
void QtAndroid::requestPermissions(const QStringList &permissions, const QtAndroid::PermissionResultCallback &callbackFunc)Asynchronously requests permissions to be granted to this application, callbackFunc will be called with the results.
This function was introduced in Qt 5.10.
Synchronously requests permissions to be granted to this application, waits timeoutMs to complete.
This function was introduced in Qt 5.10.
這兩個接口,一個是異步一個是同步,使用方法有些不一樣。需要注意的是,這個接口是從 Qt5.10才開始支持的,所以 Qt 版本必須要在5.10以上才能用。
使用方法
這里舉例申請攝像頭權限的方法:
bool Manager::requestPermission() {QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.CAMERA");if(r == QtAndroid::PermissionResult::Denied) {QtAndroid::requestPermissionsSync( QStringList() << "android.permission.CAMERA" );r = QtAndroid::checkPermission("android.permission.CAMERA");if(r == QtAndroid::PermissionResult::Denied) {return false;}}return true; }申請其他權限大同小異,只需要修改權限名就可以了。
為什么要手動申請權限?
可能有人會覺得奇怪,為什么會有這個問題?因為通常做 android 開發我們都知道,要使用這種敏感權限必須要先申請才能用,那么在 android 原生開發里面,需要在 AndroidMenifest.xml中添加相應的權限才行。早期的Qt 版本開發 Android 應用時也需要這樣做才行,要不然功能無法實現。
但是,最近在調試權限的問題時發現一個非常奇怪的事情,我使用 Qt5.11.0版本進行開發,在 QML 中直接調用 Camera 打開攝像頭,根本無需像以前那樣需要先在AndroidMenifest.xml添加相機權限,直接用就可以了,貌似在調用 Camera 的時候,底層已經默認會去自動申請了,無需手動再申請。
那可能有人會說,既然底層會自動申請了為啥還要動態去申請權限呢?
我測試過程中發現,如果不手動去申請權限,在我的 Android8.0手機上,,直接調用 Camera 時,會自動彈出權限申請框,點擊權限允許過后,進入到 Camera 發現攝像頭預覽頁面并沒有畫面,完全是空白。我猜測這里是跟系統調用的順序有關,申請權限比打開頁面慢 所以導致攝像頭預覽沒有加載出來。所以這時候就需要先手動去申請權限,然后在打開攝像頭頁面即可解決問題。
關于這部分的解釋,后期會單獨寫篇文章介紹,Android權限的申請其實還有好多很奇怪的現象,相比以前 Qt 老版本,新版的更新確實帶來了不少改進,為開發者減少了很多工作量。
參考文章:https://bugreports.qt.io/browse/QTBUG-50759
總結
以上是生活随笔為你收集整理的Qt for Android 动态申请权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 函数参数传递
- 下一篇: Qt for Android 自定义启动