7 votes

L'autorisation USB obtenue via Android.hardware.usb ne s'applique pas au NDK

J'ai pu obtenir l'autorisation de communiquer avec un appareil via l'API USB Host d'Android.

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

protected void execute(Context ctxt) {
    UsbManager manager = (UsbManager) viewer.getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();

    UsbDevice d = null;
    for (String s : deviceList.keySet()) {
        d = deviceList.get(s);
    }

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(ctxt, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    viewer.registerReceiver(mUsbReceiver, filter);

    manager.requestPermission(d, mPermissionIntent);
}

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){
                      Log.d(TAG, "Permission granted!");
                   }
                } 
                else {
                    Log.d(TAG, "permission denied for device " + device);
                }
            }
        }
    }
};

Malheureusement, cela ne donne pas à mon code NDK la permission de communiquer directement avec ce périphérique (ce qui est nécessaire pour libusb). Existe-t-il un moyen de "transférer" les permissions de Java au NDK sans Root ?

P.S. J'ai fini par utiliser des sockets UNIX pour transférer le File Descirptor original de Java vers un exécutable natif Android (j'ai GNU-isé le projet à https://github.com/martinmarinov/rtl_tcp_andro- ). Pour certaines personnes, ce serait même plus facile car elles pourraient utiliser le NDK pour se connecter directement à l'appareil (et non une application tierce) et, par conséquent, le pointeur qu'elles utilisent en Java pourrait toujours être accessible par le NDK sans avoir à s'embrouiller avec les sockets UNIX.

2voto

Lester Buck Points 408

Il n'y a pas de "transfert" de permissions possible car le modèle de sécurité d'Android exige que chaque application déclare statiquement les permissions requises et que l'utilisateur approuve l'ensemble des permissions au moment de l'installation. Aucune autorisation dynamique n'est prise en charge. Chaque application correspond à un seul UID, avec ses autorisations déclarées de manière statique dans le manifeste. Java n'est pas une limite de permission, et la VM Dalvik n'est pas un obstacle à l'exécution de code natif via le NDK. Toutes les permissions doivent être listées dans le manifeste, et l'apk peut ne contenir aucun code Java (dex).

http://developer.Android.com/guide/topics/security/permissions.html

http://osdir.com/ml/Android-ndk/2012-09/msg00094.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X