【问题标题】:QML Android Image cannot open Internal file even if exists即使存在 QML Android Image 也无法打开内部文件
【发布时间】:2018-01-06 16:51:17
【问题描述】:

我在 QML 图像项上显示存储在内部存储中的图像文件时遇到问题。我尝试了很多事情,但无法弄清楚我该如何实现它。任何帮助表示赞赏。

QML 方面:

Image {
                id: userPhotoDrawer;
                anchors.centerIn: parent;
                width   : Math.min(parent.width , parent.height);
                height  : width;
                sourceSize: Qt.size(width , height);
                source: "file:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png"
            }

            MouseArea
            {
                anchors.fill: parent;
                onClicked: Caminho.buscaImagem();
            }


            Connections
            {
                target: Caminho;
                onImagemCaminhoChanged:
                {
                    var path = Caminho.imagemCaminho;
                    Caminho.checkPath(path);
                }
            }

        }

在 cminhoImagens.cpp 中:

QString caminhoImagens::checkPath(QString pPath)
{
QFile tFile(pPath);
QStringList tList = pPath.split("/");
QString fileName = tList.last();
QString header = pPath.split(fileName).first();

QDir tdir(header);
if (tdir.exists())
{
    qDebug() << "absolute path : " << tdir.absoluteFilePath(fileName)
             << endl << "file exists : " << tFile.exists();
}
return QUrl::fromLocalFile(pPath).toString();}

解释,我正在使用图像选择器在我的应用程序中设置用户照片。根据上述函数输出,我得到了正确的路径。例如, file:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png

我还尝试通过以下方式设置 source: 来源:/storage/emulated/0/Documents/share_example_x_files/qt-logo.png

什么都没有改变。输出仍然::QML 图片:无法打开:file:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png

我还在清单文件下添加了以下权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

感谢您的帮助

【问题讨论】:

    标签: android qt permissions storage internal


    【解决方案1】:

    在尝试将文件复制到另一个地方后,我通过挖掘 QFile::errorString 找到了解决方案。错误是权限被拒绝!

    在我搜索了即使我需要对我的清单文件获得权限的原因后,我发现在 KitKat 之后,Android 想要授予用户对应用程序的权限。因此,在选择 Image 之前,我将请求权限功能放入我的 QML。

       MouseArea
                {
                    anchors.fill: parent;
                    onClicked:
                    {
                        if (PermissionManager.requestPermissions())
                            Caminho.buscaImagem();
                    }
    
                }
    

    以及相关的cpp代码:

    bool QAndroidPermissions::requestPermissions()
    

    {

    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;}
    

    【讨论】:

    • 在花了 12 小时解决问题后节省了我的时间
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多