时月oe 2023-05-23 22:11 采纳率: 44.4%
浏览 12

qt on android文件打开问题

在Qt打开Android目录的过程中,使用的是

    QAndroidJniObject externalStorageDir = QAndroidJniObject::callStaticObjectMethod(
                "android/os/Environment",
                "getExternalStorageDirectory",
//                "getExternalFilesDir",
                "()Ljava/io/File;"
                );

来获取默认文件目录,其路径为/storage/emulated/0,然后使用QDir来访问该路径下的目录,最终发现控制台可以正常输出目录下的文件夹,但是无法输出目录下的文件。请问应该如何解决呢?是否是因为QDir无法识别Android文件呢?

在AndroidMainfest文件中,将android:requestLegacyExternalStorage="true"已经设置了,但是仍然无法识别文件

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-24 08:04
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      针对在Qt中使用QDir访问Android默认文件目录时能够访问到文件夹但无法访问文件的问题,可能是因为Android的文件访问权限问题。可以尝试使用Qt的androidextras库中提供的QAndroidJniObject类来获取外部存储的权限,以便访问Android的默认文件目录。

      以下是具体解决方案:

      1. 在.pro文件中添加androidextras库的使用:

      QMAKE_LIBS_ANDROID_EXTRA += -lQt5AndroidExtras

      1. 在代码中使用QAndroidJniObject类获取外部存储的权限。示例代码如下:
      #include <QAndroidJniObject>
      #include <QtAndroid>
      
      void requestPermission()
      {
          QtAndroid::PermissionResult r = QtAndroid::checkPermission(QString("android.permission.READ_EXTERNAL_STORAGE"));
          if(r == QtAndroid::PermissionResult::Denied)
          {
              QtAndroid::requestPermissionsSync( QStringList() << "android.permission.READ_EXTERNAL_STORAGE" );
          }
      
          r = QtAndroid::checkPermission(QString("android.permission.WRITE_EXTERNAL_STORAGE"));
          if(r == QtAndroid::PermissionResult::Denied)
          {
              QtAndroid::requestPermissionsSync( QStringList() << "android.permission.WRITE_EXTERNAL_STORAGE" );
          }
      }
      
      void grantPermission()
      {
          QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/QtAndroidPermissions/QtAndroidPermissions",
                                                    "grantPermissions",
                                                    "()V");
      }
      

      其中,requestPermission()函数用于申请读/写外部存储的权限,grantPermission()函数用于获取外部存储的权限,并且需要在AndroidManifest.xml中配置对应的权限。

      1. 使用QDir访问文件夹和文件。示例代码如下:
      #include <QDir>
      
      QDir dir("/storage/emulated/0/Android/data/com.test.app/files/");
      qDebug() << "dir exists:" << dir.exists();
      qDebug() << "file count:" << dir.count();
      
      QStringList files = dir.entryList(QDir::Files, QDir::NoSort);
      foreach(QString file, files)
      {
          qDebug() << "file name:" << file;
      }
      

      其中,需要确保访问的路径是合法的,并且需要读写外部存储权限。通过设置QDir的过滤器和排序方法可以获取文件夹下所有文件的文件名,并进行相应的操作。

      希望以上解决方案可以帮助您解决问题。如果还有问题,请尝试查看相关文档或者在社区中提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 关于移动机器人坐标计算
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音