QML Android Image即使存在也无法打开内部文件

时间:2018-01-06 16:51:17

标签: android qt permissions storage internal

我在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);
                }
            }

        }

在caminhoImagens.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();}

说明,我使用图像选择器在我的应用程序中设置用户照片。我根据上面的功能输出得到了正确的路径。例如, 文件:///storage/emulated/0/Documents/share_example_x_files/qt-logo.png

我还尝试通过以下方式设置来源: 来源:/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" />

感谢您的帮助

1 个答案:

答案 0 :(得分: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;}