class AndroidImagePicker: public QAndroidActivityResultReceiver
{
public:
AndroidImagePicker() {}
void show() override {
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);
}
}
virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject & data) override {
jint RESULT_OK = QAndroidJniObject::getStaticField<jint>("android/app/Activity", "RESULT_OK");
if (receiverRequestCode == 101 && resultCode == RESULT_OK) {
QAndroidJniObject activity = QtAndroid::androidActivity();
QAndroidJniObject bytes = QAndroidJniObject::callStaticObjectMethod("lqsa/util/ImageFromActivityResult",
"getImage",
"(Landroid/content/Intent;Lorg/qtproject/qt5/android/bindings/QtActivity;)[B",
data.object<jobject>(), activity.object<jobject>());
QAndroidJniEnvironment env;
jbyteArray imageDataArray = bytes.object<jbyteArray>();
if (imageDataArray) {
jsize imageSize = env->GetArrayLength(imageDataArray);
if (imageSize > 0) {
jboolean isCopy;
jbyte *imageBytes = env->GetByteArrayElements(imageDataArray, &isCopy);
env->ReleaseByteArrayElements(imageDataArray, imageBytes, JNI_ABORT);
emit imageSelected(image);
}
}
}
}
};
class AndroidImagePicker: public QAndroidActivityResultReceiver
{
public:
AndroidImagePicker() {}
void show() override {
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);
}
}
virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject & data) override {
jint RESULT_OK = QAndroidJniObject::getStaticField<jint>("android/app/Activity", "RESULT_OK");
if (receiverRequestCode == 101 && resultCode == RESULT_OK) {
QAndroidJniObject activity = QtAndroid::androidActivity();
QAndroidJniObject bytes = QAndroidJniObject::callStaticObjectMethod("lqsa/util/ImageFromActivityResult",
"getImage",
"(Landroid/content/Intent;Lorg/qtproject/qt5/android/bindings/QtActivity;)[B",
data.object<jobject>(), activity.object<jobject>());
QAndroidJniEnvironment env;
jbyteArray imageDataArray = bytes.object<jbyteArray>();
if (imageDataArray) {
jsize imageSize = env->GetArrayLength(imageDataArray);
if (imageSize > 0) {
jboolean isCopy;
jbyte *imageBytes = env->GetByteArrayElements(imageDataArray, &isCopy);
QImage image = QImage(QImage::fromData((uchar*) imageBytes, imageSize,"JPG"));
env->ReleaseByteArrayElements(imageDataArray, imageBytes, JNI_ABORT);
emit imageSelected(image);
}
}
}
}
};
To copy to clipboard, switch view to plain text mode
package lqsa.util;
import android.content.Intent;
import org.qtproject.qt5.android.bindings.QtActivity;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ImageFromActivityResult {
public static byte[] getImage(Intent intent, QtActivity activity) throws IOException {
InputStream is = activity.getContentResolver().openInputStream(intent.getData());
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
}
package lqsa.util;
import android.content.Intent;
import org.qtproject.qt5.android.bindings.QtActivity;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ImageFromActivityResult {
public static byte[] getImage(Intent intent, QtActivity activity) throws IOException {
InputStream is = activity.getContentResolver().openInputStream(intent.getData());
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks