Add 'Passing android Intents extras to Qt'

master
Mehran Dehghanian 4 years ago
parent 355bb5cf11
commit 633d4b78e4

@ -0,0 +1,100 @@
## Passing android Intents to Qt (Pass parameters between intents) ##
Working on QField I had the necessity of passing values from the QtActivity.java to the Qt cpp world, here how I did it using an Intent that is sent to the QtActivity (the one you should not edit that comes with Qt).
For much more information see [this post series](https://www.kdab.com/qt-android-episode-7/).
hopefully this will be helpful to someone.
#### Start QtActivity
```
private void startQtActivity() {
String dotqgis2_dir = "Test dotqgis2_dir";
String share_dir = "Test share_dir";
// forward to startQtActivity and finish QFieldActivity
Intent intent = new Intent();
intent.setClass(QFieldActivity.this, QtActivity.class);
intent.putExtra("DOTQGIS2_DIR", dotqgis2_dir);
intent.putExtra("SHARE_DIR", share_dir);
startActivity(intent);
finish();
}
```
```
#include <QAndroidJniObject>
#include <QtAndroid>
#include <QDebug>
#ifdef Q_OS_ANDROID
QString getExtra(QAndroidJniObject extras, QString extra){
if(extras.isValid()){
QAndroidJniObject extra_jni = QAndroidJniObject::fromString(extra);
extra_jni = extras.callObjectMethod("getString", "(Ljava/lang/String;)Ljava/lang/String;", extra_jni.object<jstring>());
if (extra_jni.isValid()){
extra = extra_jni.toString();
qDebug() << extra;
return extra;
}
}
return "";
}
void getIntentExtras(QStringList intentExtras)
{
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
qDebug() << "activity";
QAndroidJniObject intent = activity.callObjectMethod("getIntent", "()Landroid/content/Intent;");
if (intent.isValid()) {
qDebug() << "intent: " << intent.toString();
QAndroidJniObject extras = intent.callObjectMethod("getExtras", "()Landroid/os/Bundle;");
qDebug() << "extras: " << extras.toString();
QString extra;
for (int i = 0; i < intentExtras.size(); ++i){
extra = intentExtras.at(i).toLocal8Bit().constData();
getExtra(extras, extra);
}
}
}
}
QStringList intentExtras;
intentExtras << "DOTQGIS2_DIR" << "SHARE_DIR";
getIntentExtras(intentExtras);
#endif
```
This is the first version of the cpp code that I wrote, just for reference. The below code is much cleaner.
```
#include <QAndroidJniObject>
#include <QtAndroid>
#include <QDebug>
void getIntent()
{
#ifdef Q_OS_ANDROID
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
qDebug() << "activity";
QAndroidJniObject intent = activity.callObjectMethod("getIntent", "()Landroid/content/Intent;");
if (intent.isValid()) {
qDebug() << "intent: " << intent.toString();
QAndroidJniObject extras = intent.callObjectMethod("getExtras", "()Landroid/os/Bundle;");
if(extras.isValid()){
qDebug() << "extras: " << extras.toString();
QAndroidJniObject dotqgis2_dir = QAndroidJniObject::fromString("DOTQGIS2_DIR");
QAndroidJniObject share_dir = QAndroidJniObject::fromString("SHARE_DIR");
dotqgis2_dir = extras.callObjectMethod("getString", "(Ljava/lang/String;)Ljava/lang/String;", dotqgis2_dir.object<jstring>());
share_dir = extras.callObjectMethod("getString", "(Ljava/lang/String;)Ljava/lang/String;", share_dir.object<jstring>());
if (dotqgis2_dir.isValid()){
qDebug() << dotqgis2_dir.toString();
}
if (share_dir.isValid()){
qDebug() << share_dir.toString();
}
}
}
}
#endif
}
```
[source](https://www.opengis.ch/2015/12/03/passing-android-intents-to-qt/)
Loading…
Cancel
Save