Reputation: 188
I am trying to get GPS coordinates using Qt5.2.1 on my Samsung Galaxy S2 plus. This is what i tried:
I have set the permissions in AndroidManifest.xml, from QtCreator:
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
I also tried with QNmeaPositionInfoSource class, but i have to call setDevice() method for setting a QIODevice, but i don't know where can i get that device. There is any "/dev/bcm_gps" for accessing NMEA GPS coordinates ?
Note: I am trying this on my Samsung Galaxy S2 Plus, with Cyanogenmode11 (Android 4.4.2), Baseband I9105PXXUMBI, Kernel 3.0.101. Other GPS applications works ok, so it's not a Cyanogen bug.
Here are the complete sources. It's just a minimal project for getting GPS coordinates and display them in a textedit. I don't get what i'm doing wrong.
Here is the .pro file:
#-------------------------------------------------
#
# Project created by QtCreator 2014-02-05T15:48:22
#
#-------------------------------------------------
QT += core gui positioning sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test_position
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
CONFIG += mobility
MOBILITY +=
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
OTHER_FILES += \
android/AndroidManifest.xml
Here is the main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Here i am trying the Location API:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), this, SLOT(setupGPS()));
timer->start(1000);
}
void MainWindow::setupGPS()
{
QStringList services = QGeoPositionInfoSource::availableSources();
if (services.isEmpty()) { //services is always empty
ui->textEdit->setText("positioning sources unavailable");
timer->start(1000);
return;
}
/**********************************GPS trials***********************************/
// ui->textEdit->setText("retry GPS connection");
source = QGeoPositionInfoSource::createDefaultSource(this);
if(source){ //never enter here
ui->textEdit->setText("success");
source->setPreferredPositioningMethods(QGeoPositionInfoSource::
AllPositioningMethods);
connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),
this, SLOT(positionUpdated(QGeoPositionInfo)));
source->startUpdates();
} else {
nmeaLocation = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::
RealTimeMode, this);
// ui->textEdit->setText("available sources = " + QString::number(
nmeaLocation->supportedPositioningMethods()));
QIODevice* dev = nmeaLocation->device();
if(dev){
ui->textEdit->setText("got device");
}
else {
ui->textEdit->setText("failed to get device");
}
// nmeaLocation->setDevice();
timer->start(1000);
}
}
void MainWindow::errorPositioning(QGeoPositionInfoSource::Error er){
ui->textEdit->setText("error = " + QString::number(er));
}
void MainWindow::positionUpdated(const QGeoPositionInfo &info)
{
QString latitude, longitude;
latitude.setNum(info.coordinate().latitude());
longitude.setNum(info.coordinate().longitude());
ui->textEdit->setText("Position updated: " + latitude + " " + longitude);
}
MainWindow::~MainWindow()
{
delete ui;
}
Here is the header file:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtPositioning/QGeoAddress>
#include <QtPositioning/QGeoAreaMonitorInfo>
#include <QtPositioning/QGeoAreaMonitorSource>
#include <QtPositioning/QGeoCircle>
#include <QtPositioning/QGeoCoordinate>
#include <QtPositioning/QGeoLocation>
#include <QtPositioning/QGeoPositionInfoSource>
#include <QtPositioning/QGeoSatelliteInfoSource>
#include <QtPositioning/QNmeaPositionInfoSource>
#include <QTimer>
#include <QDebug>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
QGeoPositionInfoSource *source;
QTimer* timer;
Ui::MainWindow *ui;
QNmeaPositionInfoSource *nmeaLocation;
private slots:
void setupGPS();
void errorPositioning(QGeoPositionInfoSource::Error er);
void positionUpdated(const QGeoPositionInfo &info);
};
#endif // MAINWINDOW_H
And here is the Android manifest:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:versionCode="1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto" android:versionName="1.0"
package="org.qtproject.example">
<application android:label="@string/app_name" android:hardwareAccelerated="true"
android:name="org.qtproject.qt5.android.bindings.QtApplication">
<activity android:label="@string/app_name"
android:name="org.qtproject.qt5.android.bindings.QtActivity"
android:configChanges="orientation|uiMode|screenLayout|screenSize
|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation"
android:screenOrientation="unspecified">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data android:name="android.app.lib_name" android:value="--
%%INSERT_APP_LIB_NAME%% --"/>
<meta-data android:resource="@array/qt_sources"
android:name="android.app.qt_sources_resource_id"/>
<meta-data android:name="android.app.repository" android:value="default"/>
<meta-data android:resource="@array/qt_libs"
android:name="android.app.qt_libs_resource_id"/>
<meta-data android:resource="@array/bundled_libs"
android:name="android.app.bundled_libs_resource_id"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="--
%%BUNDLE_LOCAL_QT_LIBS%% --"/>
<meta-data android:resource="@array/bundled_in_lib"
android:name="android.app.bundled_in_lib_resource_id"/>
<meta-data android:resource="@array/bundled_in_assets"
android:name="android.app.bundled_in_assets_resource_id"/>
<!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="--
%%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix"
android:value="/data/local/tmp/qt/"/>
<meta-data android:name="android.app.load_local_libs" android:value="--
%%INSERT_LOCAL_LIBS%% --"/>
<meta-data android:name="android.app.load_local_jars" android:value="--
%%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="--
%%INSERT_INIT_CLASSES%% --"/>
<!-- Messages maps -->
<meta-data android:name="android.app.ministro_not_found_msg"
android:value="@string/ministro_not_found_msg"/>
<meta-data android:name="android.app.ministro_needed_msg"
android:value="@string/ministro_needed_msg"/>
<meta-data android:name="android.app.fatal_error_msg"
android:value="@string/fatal_error_msg"/>
<!-- Messages maps -->
<!-- Splash screen -->
<meta-data android:resource="@layout/splash"
android:name="android.app.splash_screen"/>
<!-- Splash screen -->
</activity>
</application>
<uses-sdk android:targetSdkVersion="14" android:minSdkVersion="9"/>
<supports-screens android:anyDensity="true" android:smallScreens="true"
android:normalScreens="true" android:largeScreens="true"/>
<!-- %%INSERT_PERMISSIONS -->
<!-- %%INSERT_FEATURES -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
Upvotes: 1
Views: 1970
Reputation: 3448
As you can see here (middle of a post), The Qt Positioning module is not yet implemented on Android, alas. It is planned (not guaranteed) for next Qt version, 5.3, which is expected to be released around the end of april 2014 (Source).
Upvotes: 1