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
Forum Updated to NodeBB v4.3 + New Features

Android JNI, display AlertDialog for LOCATION permissions

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
2 Posts 2 Posters 1.2k 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