Adrian
Adrian

Reputation: 188

Qt5.2.1 get GPS location on Samsung Galaxy S2Plus (I9105P)

I am trying to get GPS coordinates using Qt5.2.1 on my Samsung Galaxy S2 plus. This is what i tried:

  1. Calling QGeoPositionInfoSource::availableSources() always returns an empty list.
  2. I tried QGeoPositionInfoSource::createDefaultSource() , also returns NULL pointer.
  3. I have set the permissions in AndroidManifest.xml, from QtCreator:

    android.permission.ACCESS_COARSE_LOCATION

    android.permission.ACCESS_FINE_LOCATION

  4. 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

Answers (1)

Fenix Voltres
Fenix Voltres

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

Related Questions