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. Android JNI, display AlertDialog for LOCATION permissions
Qt 6.11 is out! See what's new in the release blog

Android JNI, display AlertDialog for LOCATION permissions

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
2 Posts 2 Posters 1.5k Views 1 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.
  • BonganiB Offline
    BonganiB Offline
    Bongani
    wrote on last edited by Bongani
    #1

    I want to show an AlertDialog on my android App to request "Location" permission since it's compulsory from Android API 26. I am using JNI to call a Java function that will prompt the trigger the AlertDialog.

    below is my Java code

        public static void init(String node){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (m_instance.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    final AlertDialog.Builder builder = new AlertDialog.Builder(m_instance);
                    builder.setTitle("This app needs location access");
                    builder.setMessage("Please grant location access so this app can detect beacons.");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            m_instance.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
                        }
                    });
                    builder.show();
                }
            }
    }
    

    And this is how i am calling it from my C++ code.

        QAndroidJniObject javaNotification = QAndroidJniObject::fromString("beconNode");
        QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/beacorat/Scan",
                                                  "init",
                                                  "(Ljava/lang/String;)V",
                                                  javaNotification.object<jstring>());
    

    I am receiving the below error when trying to call the function.

    F art     : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI GetStaticMethodID called with pending exception java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    F art     : art/runtime/java_vm_ext.cc:410]   at void android.os.Handler.<init>(android.os.Handler$Callback, boolean) (Handler.java:200)
    F art     : art/runtime/java_vm_ext.cc:410]   at void android.os.Handler.<init>() (Handler.java:114)
    F art     : art/runtime/java_vm_ext.cc:410]   at void android.app.Dialog.<init>(android.content.Context, int, boolean) (Dialog.java:152)
    F art     : art/runtime/java_vm_ext.cc:410]   at void android.app.AlertDialog.<init>(android.content.Context, int, boolean) (AlertDialog.java:202)
    F art     : art/runtime/java_vm_ext.cc:410]   at android.app.AlertDialog android.app.AlertDialog$Builder.create() (AlertDialog.java:1105)
    F art     : art/runtime/java_vm_ext.cc:410]   at android.app.AlertDialog android.app.AlertDialog$Builder.show() (AlertDialog.java:1150)
    F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.example.beacorat.Scan.initBT() (Scan.java:54)
    F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.example.beacorat.Scan.startLeScan(java.lang.String) (Scan.java:74)
    
    

    This crashes the whole App.

    Please help.

    J.HilkJ 1 Reply Last reply
    0
    • BonganiB Bongani

      I want to show an AlertDialog on my android App to request "Location" permission since it's compulsory from Android API 26. I am using JNI to call a Java function that will prompt the trigger the AlertDialog.

      below is my Java code

          public static void init(String node){
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                  if (m_instance.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                      final AlertDialog.Builder builder = new AlertDialog.Builder(m_instance);
                      builder.setTitle("This app needs location access");
                      builder.setMessage("Please grant location access so this app can detect beacons.");
                      builder.setPositiveButton(android.R.string.ok, null);
                      builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                          @Override
                          public void onDismiss(DialogInterface dialog) {
                              m_instance.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
                          }
                      });
                      builder.show();
                  }
              }
      }
      

      And this is how i am calling it from my C++ code.

          QAndroidJniObject javaNotification = QAndroidJniObject::fromString("beconNode");
          QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/beacorat/Scan",
                                                    "init",
                                                    "(Ljava/lang/String;)V",
                                                    javaNotification.object<jstring>());
      

      I am receiving the below error when trying to call the function.

      F art     : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI GetStaticMethodID called with pending exception java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
      F art     : art/runtime/java_vm_ext.cc:410]   at void android.os.Handler.<init>(android.os.Handler$Callback, boolean) (Handler.java:200)
      F art     : art/runtime/java_vm_ext.cc:410]   at void android.os.Handler.<init>() (Handler.java:114)
      F art     : art/runtime/java_vm_ext.cc:410]   at void android.app.Dialog.<init>(android.content.Context, int, boolean) (Dialog.java:152)
      F art     : art/runtime/java_vm_ext.cc:410]   at void android.app.AlertDialog.<init>(android.content.Context, int, boolean) (AlertDialog.java:202)
      F art     : art/runtime/java_vm_ext.cc:410]   at android.app.AlertDialog android.app.AlertDialog$Builder.create() (AlertDialog.java:1105)
      F art     : art/runtime/java_vm_ext.cc:410]   at android.app.AlertDialog android.app.AlertDialog$Builder.show() (AlertDialog.java:1150)
      F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.example.beacorat.Scan.initBT() (Scan.java:54)
      F art     : art/runtime/java_vm_ext.cc:410]   at void org.qtproject.example.beacorat.Scan.startLeScan(java.lang.String) (Scan.java:74)
      
      

      This crashes the whole App.

      Please help.

      J.HilkJ Offline
      J.HilkJ Offline
      J.Hilk
      Moderators
      wrote on last edited by
      #2

      @Bongani

      I'm not very good with java, a reason why I'm very grateful for the QtAndroid modul.

      you can use that one for runtime permission request/check

      http://doc.qt.io/qt-5/qtandroid.html#requestPermissions

      This should help you.


      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


      Q: What's that?
      A: It's blue light.
      Q: What does it do?
      A: It turns blue.

      1 Reply Last reply
      1

      • Login

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