gpt4 book ai didi

java - Qt Java - 从图库中获取图像

转载 作者:搜寻专家 更新时间:2023-11-01 07:51:57 25 4
gpt4 key购买 nike

我正在尝试使用 Qt 从 Android 画廊获取图像。我已经使用 Java 文件 从 Java 调用了 intent,但我不知道如何将它返回到 Qt。

我有一个 Qt 类,它从打开 Android Image Picker 的 Java 文件中调用一个方法。如何将选定的图像或选定的 URI 返回给 Qt?

.h 文件

#ifndef CAMINHOIMAGENS_H
#define CAMINHOIMAGENS_H

#include <QObject>
#include <QDebug>

class caminhoImagens : public QObject
{
Q_OBJECT
Q_PROPERTY(QString imagemCaminho READ imagemCaminho NOTIFY imagemCaminhoChanged)

slots: void atualizaImagem();
public: QString imagemCaminho();
private: QString m_imagemCaminho = "";
signals: void imagemCaminhoChanged();
};

#endif // CAMINHOIMAGENS_H

.cpp 文件

#include "caminhoimagens.h"    
#include <QtAndroidExtras>

caminhoImagens::caminhoImagens()
{

}

void caminhoImagens::atualizaImagem()
{
//org.qtproject.example.acessargaleriatest
QAndroidJniObject intent = QAndroidJniObject::callStaticObjectMethod ( "org/qtproject/example/AcessarGaleriaTest/ImagePickerAndroid", "imagePicker", "()Landroid/content/Intent;");
QtAndroid::startActivity(intent, 192837465, 0);
}

QString caminhoImagens::imagemCaminho()
{
return m_imagemCaminho;
}

.java 文件

package org.qtproject.example.AcessarGaleriaTest;

import org.qtproject.qt5.android.bindings.QtActivity;
import android.content.Intent;
import android.app.Activity;

public class ImagePickerAndroid extends QtActivity {
public static Intent imagePicker() {
Intent i = new Intent(Intent.ACTION_PICK);
i.setType( "image/*");
return Intent.createChooser(i, "Select Image");
}
}

最佳答案

回答我自己的问题:

我在 Qt 中使用 QAndroidJniObject 编写了等效的 java 代码。

caminhoimages.h注册为main.cpp中的QML类型并调用方法buscaImagem()

caminhoimagens.h

#ifndef CAMINHOIMAGENS_H
#define CAMINHOIMAGENS_H

#include <QObject>

#include "imagepickerandroid.h"

#include <QDebug>

class caminhoImagens : public QObject
{
Q_OBJECT

Q_PROPERTY(QString imagemCaminho READ imagemCaminho NOTIFY imagemCaminhoChanged)

public slots:
void buscaImagem();
void retornaImagem(QString path);

public:
caminhoImagens();

QString imagemCaminho();

private:
QString m_imagemCaminho = "";

signals:
void imagemCaminhoChanged();
};

#endif //CAMINHOIMAGENS_H

caminhoimagens.cpp

#include "caminhoimagens.h"

caminhoImagens::caminhoImagens()
{

}

void caminhoImagens::buscaImagem()
{
imagePickerAndroid *imagePicker = new imagePickerAndroid();
connect(imagePicker, SIGNAL(imagemCaminhoSignal(QString)), this, SLOT(retornaImagem(QString)));

imagePicker->buscaImagem();
}

void caminhoImagens::retornaImagem(QString path)
{
qDebug() << path;

m_imagemCaminho = path;

emit imagemCaminhoChanged();
}

QString caminhoImagens::imagemCaminho()
{
return m_imagemCaminho;
}

imagepickerandroid.h

#ifndef IMAGEPICKERANDROID_H
#define IMAGEPICKERANDROID_H


#include <QObject>
#include <QtAndroidExtras>

#include <QDebug>

class imagePickerAndroid : public QObject, public QAndroidActivityResultReceiver
{
Q_OBJECT

public:
imagePickerAndroid();

void buscaImagem();

virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject & data);

signals:
void imagemCaminhoSignal(QString);
};

#endif // IMAGEPICKERANDROID_H

imagepickerandroid.cpp

#include "imagepickerandroid.h"

imagePickerAndroid::imagePickerAndroid()
{

}

void imagePickerAndroid::buscaImagem()
{
QAndroidJniObject ACTION_PICK = QAndroidJniObject::fromString("android.intent.action.GET_CONTENT");
QAndroidJniObject intent("android/content/Intent");
if (ACTION_PICK.isValid() && intent.isValid())
{
intent.callObjectMethod("setAction", "(Ljava/lang/String;)Landroid/content/Intent;", ACTION_PICK.object<jstring>());
intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("image/*").object<jstring>());
QtAndroid::startActivity(intent.object<jobject>(), 101, this);
qDebug() << "OK";
}
else
{
qDebug() << "ERRO";
}
}

void imagePickerAndroid::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)
{
qDebug() << "Trabalha com os dados";

jint RESULT_OK = QAndroidJniObject::getStaticField<jint>("android/app/Activity", "RESULT_OK");
if (receiverRequestCode == 101 && resultCode == RESULT_OK) {
QString imagemCaminho = data.callObjectMethod("getData", "()Landroid/net/Uri;").callObjectMethod("getPath", "()Ljava/lang/String;").toString();
emit imagemCaminhoSignal(imagemCaminho);

qDebug() << imagemCaminho;
}
else
{
qDebug() << "Caminho errado";
}
}

关于java - Qt Java - 从图库中获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com