Qt Android apk文件打包 踩坑记录

Posted on 2023-03-30 10:29  筱筱竹林  阅读(406)  评论(0编辑  收藏  举报

一、Sqlite数据库打包使用

参考文章:qt for Android数据库连接sqlite3

1、首先在pro文件中需要添加代码。

android {
    # data 是自定义的命名
    data.files += $$PWD/android/sqlite.db
    # /assets/是固定的
    data.path  = /assets/
    # 在android 内部存储的安装路径,手机没root好像看不到,不知道为什么。
    INSTALLS += data
}
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

这是我的项目文件夹

 

2、然后在主函数中添加android文件访问权限,并且将sqlite.db数据库自动复制到资源路径下就可以使用了。

参考文章:qt for android存储文本文件到本地

// 使用 #include <QtAndroid> 头文件,需要在pro文件中添加QT依赖库 QT += androidextras
// 不修改pro文件的话直接使用 #include <QtAndroidExtras/QtAndroid> 也可以
#include <QtAndroid>

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;
}
    
int main(int argc, char *argv[])
{
    // 1、检测文件访问权限。没有权限无法进行下一步。
    if (!checkPermission())
        return 0;
    
    // 2、检测android手机中是否存在资源路径,没有就创建。
    QDir dir("/storage/emulated/0/laser/");
    if (!dir.exists("/storage/emulated/0/laser/"))
        dir.mkdir("/storage/emulated/0/laser/");

    // 3、检测资源路径下Sqlite数据库是否存在,不存在就从打包的目录下复制过来。(安装的目录手机没root看不到,好像也访问不了。还没测试。)
    QFile file("/storage/emulated/0/laser/sqlite.db");
    if (!file.exists() || file.size() == 0){
        QFile::copy("assets:/sqlite.db",
                    "/storage/emulated/0/laser/sqltie.db");
        file.setPermissions(QFile::ReadUser | QFile::WriteUser);//设置权限//5
    }
}