2015-11-26 3 views
2

Я пытаюсь получить изображение из галереи Android с помощью Qt. Я уже вызвал intent с Java, используя Java file, но я не знаю, как вернуть его в Qt.Qt Java - Получить изображение из галереи

У меня есть класс Qt, который вызывает метод из файла Java, который открывает Android Image Picker. Как вернуть выбранное изображение или выбранный URI в Qt?

заголовочных файл

#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

Нет прямое решение, но намек: Вы должны показать новый новый вид деятельности для результата, и как только она будет закончена, вы можете получить результат. См. Http://javatechig.com/android/writing-image-picker-using-intent-in-android – Felix

+0

Как я могу это сделать с Qt? Я имею в виду получить результаты как «protected void onActivityResult», как в ссылке. – GuiDupas

+0

Ну, вот где он становится сложным. Проверьте сообщение, отправленное мной – Felix

ответ

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

Сочетание Java и C++ является довольно сложным, что, по крайней мере, если это ново для вас. В приведенной ниже ссылке показан пример вызова Java из C++ и наоборот.

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

После того, как вы знаете, как это работает в целом, вы можете решить вашу проблему, следуя этому примеру:

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

передать свой URI в Qt, создать функцию в C++, что будет вызываться из Java и передать uri в качестве параметра.