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"已经设置了,但是仍然无法识别文件

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自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的过滤器和排序方法可以获取文件夹下所有文件的文件名,并进行相应的操作。

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


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