我正在尝试使用Qt从Android
图库中获取图片。我已经使用intent
从Java调用Java file
,但我不知道如何将其返回到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");
}
}
答案 0 :(得分:3)
回答我自己的问题:
我在Qt中使用QAndroidJniObject
编写了一个等效的java代码。
在caminhoimages.h
中注册QML type
main.cpp
并调用方法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";
}
}
答案 1 :(得分:1)
结合使用Java和C ++是一件相当复杂的事情,至少对你来说是新的。下面的链接显示了如何从C ++调用Java的示例,反之亦然。
一旦您知道它的工作原理,您可以通过以下示例解决您的问题:
http://javatechig.com/android/writing-image-picker-using-intent-in-android
要将您的uri传递给Qt,请在C ++中创建一个将从Java调用并将uri作为参数传递的函数。