【问题标题】:Qt 5.2 Including External File into an Android Package?Qt 5.2 将外部文件包含到 Android 包中?
【发布时间】:2013-12-13 18:49:24
【问题描述】:

如何将外部文件包含到“apk”中?

例子:

.pro文件所在的主目录中有“123.txt”。我应该在 pro 文件中添加什么以将“123.txt”放入 apk。

我尝试了部署,部署文件夹。但它们仅适用于 Symbian 和 Windows CE。

【问题讨论】:

    标签: qt apk qt5 qmake qt5.1


    【解决方案1】:

    有两种方法可以做到这一点,都在Qt 5.1 Documentation For Android.上的“移植现有 Qt 应用程序”中提到

    1. 将它们捆绑到一个 qrc 文件中(跨平台工作)
    2. 将它们添加到“assets:”目录(特定于 Android)

    对于#2:

    “assets”目录将在您构建项目时创建。我发现在将文件打包到 apk 之前,使用“INSTALLS”qmake 变量将文件复制到目录中是最简单的。以下来自我制作的项目的 qmake 文件。请注意,对于 INSTALLS,资产的路径读取“/assets”,而不是您期望的“assets”。 (它实际上最终位于 Android 构建工作区的子目录中。)

    要从 android 中的代码访问目录,请使用“assets:”。 (在示例中,/assets/Samples ==> assets:/Samples。)

    # - setup the correct location to install to and load from
    android {
        # android platform
        # From: http://community.kde.org/Necessitas/Assets
        SAMPLES_INSTALL_PATH=/assets/Samples
    } else {
        # other platforms
        SAMPLES_INSTALL_PATH=$$OUT_PWD/Samples
    }
    
    # - setup the 'make install' step
    samples.path = $$SAMPLES_INSTALL_PATH
    samples.files += $$SAMPLE_FILES
    samples.depends += FORCE
    
    INSTALLS += samples
    

    【讨论】:

    • 1.我试过了(没有成功),但后来我了解到,即使在只读模式下,Qt 也不允许使用与 qrc 文件捆绑的数据库。
    • 2. Qt 5.2 不会生成“assets”目录。我该怎么办?
    • 我已经用我如何使用资产的示例更新了答案:目录。
    • This solution 已经过测试,可在 Qt-5.3.0 for Android 上运行
    • 这个解决方案仍然适用于 Qt 5.12.0,而之前评论中的解决方案对我不起作用。
    【解决方案2】:

    您可以使用 Qt 资源系统。默认情况下,所有 Qt 应用程序都可以使用“:/”前缀或 URL 方案前缀“qrc:”访问 qrc 文件的内容。

    另一种方法是将资源部署到包的资产目录中。如果您想与 Android API 实现更好的互操作性,这是最佳选择。您可以使用“assets:”前缀访问目录中的所有资源。与 qrc 不同,这种方法不是跨平台的解决方案。

    当您构建项目时,会在Build-Directory/android-build/ 中创建一个名为“assets”的文件夹。在资产目录中复制文件后,您可以将这些添加到您的专业版中:

    deployment.files += MyFile1
    deployment.files += MyFile2
    ...
    deployment.path = /assets
    INSTALLS += deployment
    

    资产中的文件是只读的。因此,如果要更改它们,应首先将其复制到其他位置:

    QFile dfile("assets:/MyFile1");
    if (dfile.exists())
    {
         dfile.copy("./MyFile1");
         QFile::setPermissions("./MyFile1",QFile::WriteOwner | QFile::ReadOwner);
    }
    

    【讨论】:

    • 您可以使用“assets:”前缀访问目录中的所有资源。 – 可以,但有例外。例如,Qt SQLite 数据库驱动程序只接受普通文件系统路径。
    【解决方案3】:

    特定于 User2400925

    在 QT 5.1 中,如果文件不存在,我曾经将数据库从 Assets 文件夹复制到用户的主文件夹。 App可以使用的。

    您可以通过this link

    【讨论】:

    • SQLite 数据库文件确实需要复制到文件系统文件夹,即使是只读访问也是如此。因为 Qt 将文件标识符传递给底层 SQLite3 库 (see) 并且只能处理文件系统路径,而不是 assets:/qrc:/ 方案。
    【解决方案4】:

    一种更简单的方法:

    1) 将此字符串添加到您的 .pro 中

    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources

    2) 在您的 proj 文件夹中创建 android-sources 文件夹。将您需要的任何内容放入 android-sources/assets/.您还可以将要复制和更新到目标包中的任何其他文件(例如 AndroidManifest.xml 或 android-sources/res/drawable/icon.png)放在那里。

    【讨论】:

      【解决方案5】:

      一种更简单的方法:

      1. 将此字符串添加到您的 .pro 中

      ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources

      1. 在您的 proj 文件夹中创建 android-sources 文件夹。将您需要的任何内容放入 android-sources/assets/.您还可以将要复制和更新到目标包中的任何其他文件(例如 AndroidManifest.xml 或 android-sources/res/drawable/icon.png)放在那里。

      【讨论】:

      • 这只是从一年多前发布的 art926 的答案中复制/粘贴的。
      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2019-11-09
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多