简体   繁体   English

Qt Java-从图库获取图像

[英]Qt Java - Get image from gallery

I am trying to get an image from Android gallery using Qt. 我正在尝试使用Qt从Android画廊获取图像。 I have already called the intent from Java using a Java file , but I don't know how to return it to Qt. 我已经使用Java file从Java调用了intent ,但是我不知道如何将其返回给Qt。

I have a Qt class that calls a method from a Java file that opens the Android Image Picker . 我有一个Qt类,该类从打开Android Image Picker的Java文件中调用方法。 How can I return the selected image or the selected URI to Qt? 如何将选定的图像或选定的URI返回Qt?

the .h file .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

The .cpp file .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;
}

The .java file .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");
    }
}

Answering my own question: 回答我自己的问题:

I have done my code in Qt using QAndroidJniObject to write a equivalent java code. 我已经在Qt中使用QAndroidJniObject编写了等效的Java代码。

Register the caminhoimages.h as a QML type in the main.cpp and call the method buscaImagem() main.cpp中将caminhoimages.h注册为QML type ,然后调用方法buscaImagem()

caminhoimagens.h 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 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 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 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";
    }
}

Combining Java and C++ is a rather complex thing, at least if it's new to you. 至少将Java和C ++结合使用对您来说是一件相当复杂的事情。 This link below shows an example on how to call Java from C++ and the other way around. 下面的链接显示了有关如何从C ++调用Java的示例。

https://www.qtdeveloperdays.com/sites/default/files/BogdanVatra_Extending_Qt_Android_Apps_with_JNI.pdf https://www.qtdeveloperdays.com/sites/default/files/BogdanVatra_Extending_Qt_Android_Apps_with_JNI.pdf

Once you know how that works in general, you can solve your problem by following this example: 一旦知道了一般的工作原理,就可以通过以下示例解决问题:

http://javatechig.com/android/writing-image-picker-using-intent-in-android http://javatechig.com/android/writing-image-picker-using-intent-in-android

To pass your uri to Qt, create a function in C++ that will be called from Java and pass the uri as a parameter. 要将uri传递给Qt,请使用C ++创建一个将从Java调用的函数,并将uri作为参数传递。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM