Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Hot to get Android USB device permisson with QAndroidJniObject?



  • Hot to get Android USB device permisson with QAndroidJniObject.

    Hello.I have an android device which should work as a usb host. At first i tried to use an intent approach as described here, and although i got a permission request dialog, the permission didn't apply. So i decided to get permissions from user directly.

    Here's the java code i found that is used to request permissions.

    public class MyUsbDevice extends Activity {
    
        private static MyUsbDevice m_instance;
        private static UsbManager m_usbManager;
        private static PendingIntent mPermissionIntent;
        private static HashMap<String, Integer> deviceCache = new HashMap<String, Integer>();
        private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    
    
        public MyUsbDevice()
        {
            m_instance = this;
        }
    
    
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            if (m_usbManager==null) {
                m_usbManager = (UsbManager) m_instance.getSystemService(USB_SERVICE);
            }
    
            mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
            IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
            registerReceiver(mUsbReceiver, filter);
        }
    
        @Override
        public void onDestroy()
        {
            super.onDestroy();
        }
    
    
        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (ACTION_USB_PERMISSION.equals(action)) {
                    synchronized (this) {
                        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                            if(device != null){
                                m_instance.openDevice(device);
                            }
                        }
                    }
                }
            }
        };
    
    
        public void openDevice(UsbDevice device)
        {
                UsbDeviceConnection devConn = m_usbManager.openDevice(device);
                Integer fd = devConn.getFileDescriptor();
                deviceCache.put(device.getDeviceName(), fd);
        }
    
    
        public static int tryOpenDevice()
        {
            HashMap<String, UsbDevice> deviceList = m_usbManager.getDeviceList();
            Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
            while(deviceIterator.hasNext()) {
                UsbDevice device = deviceIterator.next();
                    m_usbManager.requestPermission(device, mPermissionIntent);
                    break;
            }
            return 1;
        }
    
    
    //  this call works
        public static int tes()
        {
            return 1;
        }
    
    }
    

    And JNI call from C++:

    
    // this call works
    int res1 = QAndroidJniObject::callStaticMethod<jint>("com/example/myusbdevice/MyUsbDevice", "test", "()I");
    
    // this doesn't work
    int res2 = QAndroidJniObject::callStaticMethod<jint>("com/example/myusbdevice/MyUsbDevice", "tryOpenDevice", "()I");
    

    Nothing happens, i don't get any popup dialog. I think is't because i must somehow "create" an activity first, but how?

    I'm very new to android, so any help will be appreciated.