Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Qt Android Precise Location Issue
Forum Updated to NodeBB v4.3 + New Features

Qt Android Precise Location Issue

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
11 Posts 3 Posters 1.2k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • myzinskyM myzinsky

    I implemented a class that gives me the GPS-Location for my app. Here a minimal example:

    rbManager::rbManager(QObject *parent)
        : QAbstractListModel(parent)
    {
        nm = nullptr;
        initialized = false;
    
        QLocationPermission locationPermission;
        locationPermission.setAccuracy(QLocationPermission::Precise);
    
        if(qApp->checkPermission(locationPermission) != Qt::PermissionStatus::Granted) {
            qApp->requestPermission(QLocationPermission{}, this, &rbManager::permissionUpdated);
        } else {
            qDebug() << "PERMISSION ALREADY GRANTED";
            init();
        }
    }
    
    void rbManager::permissionUpdated(const QPermission &permission) {
        if (permission.status() == Qt::PermissionStatus::Granted) {
            qDebug() << "PERMISSION GRANTED";
            init();
        } else {
            qDebug() << "PERMISSION NOT GRANTED";
        }
    }
    

    The init function does something with the gps coordinates. On iOS everything works like expected. However on Android it does not work!

    I did everything which was mentioned in the qt6 docs: https://doc.qt.io/qt-6/qlocationpermission.html

    I used QLocationPermission::Precise as you can see in my C++ code. And I put this

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    

    in my manifest.

    On the console I get this output:

    D libCloudLogOffline_arm64-v8a.so: INIT
    I qt.positioning.android: Unknown positioningMethod
    I qt.positioning.android: Unknown positioningMethod
    W qt.positioning.android: : Position data not available due to missing permission
    

    So what I'm doing wrong here?

    Edit: Also I should mention, that when the app is installed and started for the first time, I'm asked only for approximate location... Maybe there is a bug in Qt?

    ekkescornerE Offline
    ekkescornerE Offline
    ekkescorner
    Qt Champions 2016
    wrote on last edited by
    #2

    @myzinsky have you tried to request per mission for Precise and Approximate location ?

    ekke ... Qt Champion 2016 | 2024 ... mobile business apps
    5.15 --> 6.8 https://t1p.de/ekkeChecklist
    QMake --> CMake https://t1p.de/ekkeCMakeMobileApps

    1 Reply Last reply
    0
    • myzinskyM myzinsky

      I implemented a class that gives me the GPS-Location for my app. Here a minimal example:

      rbManager::rbManager(QObject *parent)
          : QAbstractListModel(parent)
      {
          nm = nullptr;
          initialized = false;
      
          QLocationPermission locationPermission;
          locationPermission.setAccuracy(QLocationPermission::Precise);
      
          if(qApp->checkPermission(locationPermission) != Qt::PermissionStatus::Granted) {
              qApp->requestPermission(QLocationPermission{}, this, &rbManager::permissionUpdated);
          } else {
              qDebug() << "PERMISSION ALREADY GRANTED";
              init();
          }
      }
      
      void rbManager::permissionUpdated(const QPermission &permission) {
          if (permission.status() == Qt::PermissionStatus::Granted) {
              qDebug() << "PERMISSION GRANTED";
              init();
          } else {
              qDebug() << "PERMISSION NOT GRANTED";
          }
      }
      

      The init function does something with the gps coordinates. On iOS everything works like expected. However on Android it does not work!

      I did everything which was mentioned in the qt6 docs: https://doc.qt.io/qt-6/qlocationpermission.html

      I used QLocationPermission::Precise as you can see in my C++ code. And I put this

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      

      in my manifest.

      On the console I get this output:

      D libCloudLogOffline_arm64-v8a.so: INIT
      I qt.positioning.android: Unknown positioningMethod
      I qt.positioning.android: Unknown positioningMethod
      W qt.positioning.android: : Position data not available due to missing permission
      

      So what I'm doing wrong here?

      Edit: Also I should mention, that when the app is installed and started for the first time, I'm asked only for approximate location... Maybe there is a bug in Qt?

      MesrineM Offline
      MesrineM Offline
      Mesrine
      wrote on last edited by Mesrine
      #3

      @myzinsky
      I am getting the same error when getting Precise location.
      But if use Approximate it works.

      Edit: Checking Precise location permission also works.

      The error: Position data not available due to missing permission
      was due to using an active qml PositionSource without granting the permissions.
      I think this could change in the next run :).

      ekkescornerE 1 Reply Last reply
      0
      • MesrineM Mesrine

        @myzinsky
        I am getting the same error when getting Precise location.
        But if use Approximate it works.

        Edit: Checking Precise location permission also works.

        The error: Position data not available due to missing permission
        was due to using an active qml PositionSource without granting the permissions.
        I think this could change in the next run :).

        ekkescornerE Offline
        ekkescornerE Offline
        ekkescorner
        Qt Champions 2016
        wrote on last edited by ekkescorner
        #4

        @Mesrine both together don't work ? I mean: at first request Approximate, then Precise
        or what happens with both in Manifest and then request only Precise

        ekke ... Qt Champion 2016 | 2024 ... mobile business apps
        5.15 --> 6.8 https://t1p.de/ekkeChecklist
        QMake --> CMake https://t1p.de/ekkeCMakeMobileApps

        MesrineM 1 Reply Last reply
        0
        • ekkescornerE ekkescorner

          @Mesrine both together don't work ? I mean: at first request Approximate, then Precise
          or what happens with both in Manifest and then request only Precise

          MesrineM Offline
          MesrineM Offline
          Mesrine
          wrote on last edited by
          #5

          @ekkescorner

          Now it is working asking for Precise location.
          I tried asking first Aproximate and then Precise but I think once you ask for Aproximate, asking(qApp->checkPermission(lPermission)) later for Precise will give Qt::PermissionStatus::Denied

          I have edited my previous comment.

          myzinskyM 1 Reply Last reply
          0
          • MesrineM Mesrine

            @ekkescorner

            Now it is working asking for Precise location.
            I tried asking first Aproximate and then Precise but I think once you ask for Aproximate, asking(qApp->checkPermission(lPermission)) later for Precise will give Qt::PermissionStatus::Denied

            I have edited my previous comment.

            myzinskyM Offline
            myzinskyM Offline
            myzinsky
            wrote on last edited by
            #6

            @Mesrine

            So now, I ask for approx. first and then for precise.

            I qt.positioning.android: Unknown positioningMethod
            I qt.positioning.android: Unknown positioningMethod
            W qt.positioning.android: : Position data not available due to missing permission
            

            still I get this warning, and I don't see the GPS coordinates dropping out as for iOS :-(

            ekkescornerE 1 Reply Last reply
            0
            • myzinskyM myzinsky

              @Mesrine

              So now, I ask for approx. first and then for precise.

              I qt.positioning.android: Unknown positioningMethod
              I qt.positioning.android: Unknown positioningMethod
              W qt.positioning.android: : Position data not available due to missing permission
              

              still I get this warning, and I don't see the GPS coordinates dropping out as for iOS :-(

              ekkescornerE Offline
              ekkescornerE Offline
              ekkescorner
              Qt Champions 2016
              wrote on last edited by
              #7

              @myzinsky from my understanding @Mesrine now only asks for Precise and it's important to ask for permission before using PositionSource

              ekke ... Qt Champion 2016 | 2024 ... mobile business apps
              5.15 --> 6.8 https://t1p.de/ekkeChecklist
              QMake --> CMake https://t1p.de/ekkeCMakeMobileApps

              MesrineM 1 Reply Last reply
              0
              • ekkescornerE ekkescorner

                @myzinsky from my understanding @Mesrine now only asks for Precise and it's important to ask for permission before using PositionSource

                MesrineM Offline
                MesrineM Offline
                Mesrine
                wrote on last edited by Mesrine
                #8

                @ekkescorner

                Exactly. In my case the warning W qt.positioning.android: : Position data not available due to missing permission was because I had an active position source without having granted location permissions.

                My recommendation is to ask for permission(approximate or precise) first and check that all the properties/bindings that need the coordinates work after the permission is granted.

                I qt.positioning.android: Unknown positioningMethod i do not know where is coming.

                myzinskyM 1 Reply Last reply
                0
                • MesrineM Mesrine

                  @ekkescorner

                  Exactly. In my case the warning W qt.positioning.android: : Position data not available due to missing permission was because I had an active position source without having granted location permissions.

                  My recommendation is to ask for permission(approximate or precise) first and check that all the properties/bindings that need the coordinates work after the permission is granted.

                  I qt.positioning.android: Unknown positioningMethod i do not know where is coming.

                  myzinskyM Offline
                  myzinskyM Offline
                  myzinsky
                  wrote on last edited by
                  #9

                  @Mesrine @ekkescorner

                  But I think that's what im doing, I check first of all for all permissions and then I initialize positioning with my init() method.

                  Side note: When I ask for the permissions already at app start, in the constructor of my class, the app crashes because I think the QML cannot be loaded. Therefore I call the checkPermissions function before I want to get GPS coordinates.

                  You can see my code here:

                  1st: QML call: https://github.com/myzinsky/cloudLogOffline/blob/d374acba334ff6cb33fb57bf7ef9d94f2dcb84b5/qml/SettingsView.qml#L197
                  2nd: C++ processing: https://github.com/myzinsky/cloudLogOffline/blob/d374acba334ff6cb33fb57bf7ef9d94f2dcb84b5/src/repeatermodel.cpp#L51

                  That is the output:

                  D libCloudLogOffline_arm64-v8a.so: PRECISE PERMISSION GRANTED
                  D libCloudLogOffline_arm64-v8a.so: INIT
                  I qt.positioning.android: Unknown positioningMethod
                  I qt.positioning.android: Unknown positioningMethod
                  W qt.positioning.android: : Position data not available due to missing permission
                  

                  So permission was granted and I don't get coordinates. Although I do it in the order that you propose.

                  MesrineM 1 Reply Last reply
                  0
                  • myzinskyM myzinsky

                    @Mesrine @ekkescorner

                    But I think that's what im doing, I check first of all for all permissions and then I initialize positioning with my init() method.

                    Side note: When I ask for the permissions already at app start, in the constructor of my class, the app crashes because I think the QML cannot be loaded. Therefore I call the checkPermissions function before I want to get GPS coordinates.

                    You can see my code here:

                    1st: QML call: https://github.com/myzinsky/cloudLogOffline/blob/d374acba334ff6cb33fb57bf7ef9d94f2dcb84b5/qml/SettingsView.qml#L197
                    2nd: C++ processing: https://github.com/myzinsky/cloudLogOffline/blob/d374acba334ff6cb33fb57bf7ef9d94f2dcb84b5/src/repeatermodel.cpp#L51

                    That is the output:

                    D libCloudLogOffline_arm64-v8a.so: PRECISE PERMISSION GRANTED
                    D libCloudLogOffline_arm64-v8a.so: INIT
                    I qt.positioning.android: Unknown positioningMethod
                    I qt.positioning.android: Unknown positioningMethod
                    W qt.positioning.android: : Position data not available due to missing permission
                    

                    So permission was granted and I don't get coordinates. Although I do it in the order that you propose.

                    MesrineM Offline
                    MesrineM Offline
                    Mesrine
                    wrote on last edited by Mesrine
                    #10

                    @myzinsky

                    I think this
                    qApp->requestPermission(QLocationPermission{}, this, &rbManager::precisePermissionUpdated);
                    should be
                    qApp->requestPermission(preciselocationPermission, this, &rbManager::precisePermissionUpdated);
                    With this, you will be asking for precise location permission.
                    Also
                    qApp->requestPermission(QLocationPermission{}, this, &rbManager::precisePermissionUpdated);

                    execute
                    void rbManager::precisePermissionUpdated(const QPermission &permission)
                    But I am not sure about the function arguments const QPermission &permission .
                    Normally what I do is to check for permission again after
                    qApp->requestPermission
                    As explained here.
                    This is how I do it here
                    Sorry, I did not notice this before on the post.

                    myzinskyM 1 Reply Last reply
                    0
                    • MesrineM Mesrine

                      @myzinsky

                      I think this
                      qApp->requestPermission(QLocationPermission{}, this, &rbManager::precisePermissionUpdated);
                      should be
                      qApp->requestPermission(preciselocationPermission, this, &rbManager::precisePermissionUpdated);
                      With this, you will be asking for precise location permission.
                      Also
                      qApp->requestPermission(QLocationPermission{}, this, &rbManager::precisePermissionUpdated);

                      execute
                      void rbManager::precisePermissionUpdated(const QPermission &permission)
                      But I am not sure about the function arguments const QPermission &permission .
                      Normally what I do is to check for permission again after
                      qApp->requestPermission
                      As explained here.
                      This is how I do it here
                      Sorry, I did not notice this before on the post.

                      myzinskyM Offline
                      myzinskyM Offline
                      myzinsky
                      wrote on last edited by
                      #11

                      @Mesrine Okay, that was dumb :-D just a copy-paste issue ... Thanks anyway for the help! Now it works.

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved