Qt Android 申请写文件到内部存储

发布于:2024-04-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

问题描述

在项目中我们有一个软件配置文件,在软件更新一些配置后需要将配置信息保存到配置文件中,Windows 下是将配置文件保存到软件当前目录下,但是 Android 环境下无法保存到程序当前目录,最终只能将配置文件保存到内部存储中(平板的存储器)。

Android 写文件是需要申请权限的。

解决方案

  1. 在 UPCNC3.pro 中添加 Android 扩展模块。
android {
QT += androidextras
}

  1. main.cpp 头部添加头文件。
#ifdef __ANDROID__
#include <QtAndroid>
// 在 UPCNC3.pro 中没有添加模块时可以直接这样引用头文件
// #include <QtAndroidExtras/QtAndroid>
#endif

  1. 写一个函数申请写文件权限,在平板上运行时会弹窗申请权限。
#ifdef __ANDROID__
bool checkPermission()
{
    QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if(r == QtAndroid::PermissionResult::Denied) {
        QtAndroid::requestPermissionsSync( QStringList() << "android.permission.WRITE_EXTERNAL_STORAGE" );
        r = QtAndroid::checkPermission("android.permission.WRITE_EXTERNAL_STORAGE");
        if(r == QtAndroid::PermissionResult::Denied) {
             return false;
        }
   }
   return true;
}
#endif

  1. main 函数中调用申请权限函数,之后就可以在 /storage/emulated/0 目录下读写文件了。
int main(int argc, char *argv[])
{
#ifdef __ANDROID__
    if(checkPermission())
        return -1;
    QString appPath = "/storage/emulated/0/UPCNC3";
    QDir dir(appPath);
    if(!dir.exists()) {
        qInfo() << "create " << appPath << dir.mkdir(appPath);
    }

    // 如果校准脚本不存在,复制校准脚本
    QString scriptPath = "/storage/emulated/0/UPCNC3/script";
    if(!QFile::exists(scriptPath + "/Calculate.lua"))
        copyDirectory("assets:/script/", scriptPath);
#endif
    //...
}