Qt Androidで外部ストレージにアクセス出来ない場合に試すこと


概要

Qt Creatorを使って書いたソフトウェアでAndroidのストレージにアクセスしようとしても「permission denied」となりハマりました。
インターネットで調べても中々これだ!という記事が見つけられず困ったので記事として残そうと思います。

Qtを使ったAndroid開発は初心者です。
こうするのが今の主流だ!などがあれば、是非ご指摘ください。

確認環境

Qt Version : 5.13.1
Qt Creator : 4.10.0

解決方法

以下の設定を行う必要があります。

  1. 「AndroidManifest.xml」にて「android.permission.READ_EXTERNAL_STORAGE」を追加します。しかし、API Level 24以降(?)ではうまくいきません。

  2. 以下のようなコードを書き、呼び出すことでAndroidデバイス上で「〇〇へのアクセスを許可しますか?」という確認ダイアログを表示させることが出来るようです。ダイアログ上で許可することでソフトウェアはAndroidストレージへアクセス出来るようになります。肝は「requestAndroidPermissions」メソッドになります。

main.cpp

#if defined (Q_OS_ANDROID)
#include <QtAndroid>

bool requestAndroidPermissions(){
    //Request requiered permissions at runtime

    const QVector<QString> permissions({"android.permission.READ_EXTERNAL_STORAGE"});

    for(const QString &permission : permissions){
        auto result = QtAndroid::checkPermission(permission);
        if(result == QtAndroid::PermissionResult::Denied){
            auto resultHash = QtAndroid::requestPermissionsSync(QStringList({permission}));
            if(resultHash[permission] == QtAndroid::PermissionResult::Denied)
                return false;
        }
    }

    return true;
}
#endif
~
int main(int argc, char *argv[])
{
#if defined (Q_OS_ANDROID)
    if(!requestAndroidPermissions())
        return -1;
#endif
~

参考にしたサイト様

終わり

一つのソフトウェア完成までの道のりは長いです...。Qiita、Qt Forum、Qtの公式ドキュメントには毎回助けられています。ありがとうございます。