qml grabToImage saveToFile在Android上返回false在桌面上返回true

qml grabToImage saveToFile在Android上返回false在桌面上返回true,android,ios,qt,qml,qtquick2,Android,Ios,Qt,Qml,Qtquick2,以下qml(QtQuick 2.7)代码在桌面(Linux、Windows、OSX)上返回true,但在Android和ios上返回false(用于写入外部存储的Android权限在Manifest.Xml中设置) 移动设备上的代码有什么问题?(imagePath已正确解析为标准图片位置,即Android上的存储/模拟/0/图片) 调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告 如果我是你,我会将QImage::save()的定义更改为以下内容,然后构建qtbase: bool

以下qml(QtQuick 2.7)代码在桌面(Linux、Windows、OSX)上返回true,但在Android和ios上返回false(用于写入外部存储的Android权限在Manifest.Xml中设置)

移动设备上的代码有什么问题?(imagePath已正确解析为标准图片位置,即Android上的存储/模拟/0/图片)

调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告

如果我是你,我会将
QImage::save()
的定义更改为以下内容,然后构建qtbase:

bool QImage::save(const QString &fileName, const char *format, int quality) const
{
    if (isNull())
        return false;
    QImageWriter writer(fileName, format);
    const bool saved = d->doImageIO(this, &writer, quality);
    qDebug() << writer.errorString();
    return saved;
}
一旦知道图像无法保存的原因,就可以删除此代码。

调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告

如果我是你,我会将
QImage::save()
的定义更改为以下内容,然后构建qtbase:

bool QImage::save(const QString &fileName, const char *format, int quality) const
{
    if (isNull())
        return false;
    QImageWriter writer(fileName, format);
    const bool saved = d->doImageIO(this, &writer, quality);
    qDebug() << writer.errorString();
    return saved;
}

一旦知道图像无法保存的原因,就可以删除此代码。

文档中说“如果无法启动抓取,函数将返回false。”。所以再说一遍:为什么抓取不是在安卓上启动的?安卓的哪个版本?在清单中设置权限已经不够了,您需要转到设置->应用->应用并启用存储权限,或者需要使用QAndroidJniObject请求运行时权限。您是否尝试写入QStandardPath::​可写位置(QStandardPath::AppDataLocation)?您应该可以在没有存储许可的情况下执行此操作谢谢Mark,我将尝试您的两个建议,看看哪一个更适合我的应用程序。文档中说“如果无法启动抓取,函数将返回false。”。所以再说一遍:为什么抓取不是在安卓上启动的?安卓的哪个版本?在清单中设置权限已经不够了,您需要转到设置->应用->应用并启用存储权限,或者需要使用QAndroidJniObject请求运行时权限。您是否尝试写入QStandardPath::​可写位置(QStandardPath::AppDataLocation)?你应该能够做到这一点,没有存储许可,谢谢你,马克,我会尝试两个建议,看看哪一个更适合我的应用程序。我会尝试QiFieWrrime-但作为一个相对初学者,我不知道如何调用C++从QML。如何把GruttoIsAm的结果传递给QiFixFrror。哦,对了,我忘了提到你可以直接从C++中做这件事。我再举一个例子,非常感谢,这很有效。现在我收到了这样一条信息:无法写入图像:“无法打开设备进行写入:权限被拒绝”我想我必须寻找合适的Android(和ios)权限。顺便说一句:我不得不更改代码的前两行:
QImage图像(100100,QImage::Format_Mono);QImageWriter imageWriter(imagePath.toString()+“/test.png”,“png”)…在ios上,消息读取无法写入图像:“无法打开设备进行写入:没有这样的文件或目录”-可能imagePath错误-我的代码:
QUrl imagePath;常量QStringList picturesLocation=qstandardpath::standardplocations(qstandardpath::picturesLocation);if(picturesLocation.isEmpty())imagePath=appPath.resolved(QUrl(“图像”));else imagePath=QString(“%1”).arg(picturesLocation.first())我会尝试QiFieWrrime-但作为一个相对初学者,我不知道如何调用QC++从QML。如何把GruttoIsAm的结果传递给QiFixFrror。哦,对了,我忘了提到你可以直接从C++中做这件事。我再举一个例子,非常感谢,这很有效。现在我收到了这样一条信息:无法写入图像:“无法打开设备进行写入:权限被拒绝”我想我必须寻找合适的Android(和ios)权限。顺便说一句:我不得不更改代码的前两行:
QImage图像(100100,QImage::Format_Mono);QImageWriter imageWriter(imagePath.toString()+“/test.png”,“png”)…在ios上,消息读取无法写入图像:“无法打开设备进行写入:没有这样的文件或目录”-可能imagePath错误-我的代码:
QUrl imagePath;常量QStringList picturesLocation=qstandardpath::standardplocations(qstandardpath::picturesLocation);if(picturesLocation.isEmpty())imagePath=appPath.resolved(QUrl(“图像”));else imagePath=QString(“%1”).arg(picturesLocation.first())
#include <QGuiApplication>
#include <QQmlApplicationEngine>

// Add this...
#include <QImage>
#include <QImageWriter>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    // ... and this
    QImage image("path/to/my/image.png");
    QImageWriter imageWriter;
    if (!imageWriter.write(image)) {
        qDebug() << "Failed to write image:" << imageWriter.errorString();
    }

    return app.exec();
}