当前位置: 首页 > article >正文

Qt如何获取安卓系统Files的Documents路径 -- 3种方法

Qt如何获取安卓系统Files的Documents路径

Qt 中获取 Android 系统的 Files/Documents 路径,可以通过 Qt 的跨平台 APIJNI 来实现。


方法 1:使用 QStandardPaths 获取应用私有 Documents 路径

Qt 提供了 QStandardPaths 类,可以用来访问应用程序的标准路径。例如,获取当前应用的私有文件夹下的 Documents 目录。

#include <QStandardPaths>
#include <QDebug>

QString documentsPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
qDebug() << "Documents Path:" << documentsPath;

说明

  • QStandardPaths::DocumentsLocation 返回当前应用的私有 Documents 目录。

  • 这个路径通常是在 getExternalFilesDir() 对应的目录下,比如:

    /storage/emulated/0/Android/data/com.yourapp/files/Documents
    

如果需要确保子目录存在,可以手动创建:

QDir dir(documentsPath);
if (!dir.exists()) {
    dir.mkpath(".");
}

方法 2:使用 JNI 调用 Android 的原生方法

如果需要访问公共 Documents 目录(即 Environment.DIRECTORY_DOCUMENTS),可以通过 JNI 调用 Android 原生的 Java API。

步骤

  1. 添加必要的 JNI 调用代码
    在 Qt 项目中使用 QAndroidJniObject 来调用 Android 的 Java API。
#include <QAndroidJniObject>
#include <QDebug>

QString getAndroidDocumentsPath() {
    QAndroidJniObject env = QAndroidJniObject::callStaticObjectMethod(
        "android/os/Environment",
        "getExternalStoragePublicDirectory",
        "(Ljava/lang/String;)Ljava/io/File;",
        QAndroidJniObject::fromString("Documents").object<jstring>()
    );

    if (env.isValid()) {
        QString documentsPath = env.toString();
        qDebug() << "Public Documents Path:" << documentsPath;
        return documentsPath;
    } else {
        qWarning() << "Failed to get public Documents path!";
        return QString();
    }
}
  1. 调用函数
    在代码中直接调用 getAndroidDocumentsPath() 函数即可获取路径。

输出路径示例

调用成功后会返回设备上的公共 Documents 目录,例如:

/storage/emulated/0/Documents

方法 3:Storage Access Framework(适配 Android 10+)

对于 Android 10 (API 29) 及以上版本,Google 强制推荐使用 Storage Access Framework (SAF),这涉及到用户选择路径并返回 URI。通过 JNI 可以实现 SAF 操作。

关键点

  • 启动文件选择器 Intent,通过 JNI 触发。
  • 用户选择目录后,返回一个 URI。
  • 通过 Qt 的文件访问功能处理该 URI。

方法对比

方法适用场景优缺点
QStandardPaths应用私有路径,兼容性好易用性强,但路径仅限于应用私有文件夹,无法访问公共目录
JNI 调用访问公共 Documents 目录灵活性高,但实现复杂,需要动态权限处理
Storage Access FrameworkAndroid 10+,用户授权访问指定路径满足系统规范,但用户需手动选择,较复杂

建议

  • 如果只是存储和读取应用的私有文档,推荐使用 QStandardPaths
  • 如果需要操作公共 Documents 目录,并支持多 Android 版本,可结合 JNI 调用和动态权限处理实现。

http://www.kler.cn/a/408870.html

相关文章:

  • 【Rust练习】23.生命周期
  • 【npm设置代理-解决npm网络连接error network失败问题】
  • 【FPGA开发】Vivado自定义封装IP核,绑定总线
  • wordpress调用文章上一篇 下一篇的标题和链接
  • 递归算法专题一>Pow(x, n)
  • ValueError: bbox_params must be specified for bbox transformations
  • 深入探索JMeter的执行器时间线:从CLArgsParser到JmeterEngine
  • Spring Boot OA:企业办公自动化的新趋势
  • 如何使用 MgoSoft PDF To Image 将 PDF 转换成 JPG 图片
  • 太通透了,Android 流程分析 蓝牙enable流程(应用层/Framework/Service层)
  • 贪心算法(2)
  • 【Linux】————多线程(概念及控制)
  • 转置卷积与全卷积网络FCN在语义分割中的应用
  • OAI-5G开源通信平台实践(五)
  • 【Ubuntu 22.04】VMware 17 安装Ubuntu 22.04+配置VSCode+Python开发环境
  • ACP科普:风险价值矩阵
  • 中小企业人事管理:SpringBoot实现指南
  • Spark——安装步骤详细教程
  • VSCode 新建 Python 包/模块 Pylance 无法解析
  • springcloud alibaba之shcedulerx实现分布式锁
  • ES 基本使用与二次封装
  • 5G RedCap有哪些技术特点
  • 2024最新YT-DLP使用demo网页端渲染
  • 系统分析与重构指南:现代软件工程的质量提升策略
  • 力扣刷题--41.缺失的第一个正数【困难】
  • repmgr安装及常用运维指令