2012-12-20 12 views
5

Sono stato in grado di ottenere un'autorizzazione per comunicare con un dispositivo tramite l'API host USB di Android.Il permesso USB ottenuto tramite android.hardware.usb non si applica a NDK

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); 
       } 
      } 
     } 
    } 
}; 

Purtroppo questo non dà il permesso di codice NDK di comunicare direttamente con questo dispositivo (che è necessario per libusb). C'è un modo per "trasferire" le autorizzazioni da Java a NDK senza root?

P.S. Ho finito per utilizzare socket UNIX per trasferire il descrittore di file originale da Java a un eseguibile nativo di Android (ho GNU-ed il progetto a https://github.com/martinmarinov/rtl_tcp_andro-). Per alcune persone sarebbe ancora più facile dal momento che potrebbero utilizzare NDK per connettersi direttamente al dispositivo (non un'app di terze parti) e quindi il puntatore che usano in Java potrebbe essere ancora accessibile dall'NDK senza doversi preoccupare di Prese UNIX.

risposta

2

Non esiste un "trasferimento" di autorizzazioni possibile perché il modello di sicurezza Android richiede che ogni applicazione dichiari staticamente le proprie autorizzazioni richieste e l'utente approva il set di autorizzazioni al momento dell'installazione. Nessuna autorizzazione dinamica è supportata. Ogni app viene mappata su un singolo UID, con le sue autorizzazioni dichiarate staticamente nel manifest. Java non è un limite di autorizzazione e la VM di Dalvik non costituisce un ostacolo all'esecuzione di codice nativo tramite NDK. Tutte le autorizzazioni devono essere elencate nel manifest e l'apk non può contenere alcun codice Java (dex).

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

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

+0

Quindi vuoi dire che ogni volta che sono l'accesso al dispositivo USB tramite API Java host USB, sto in realtà usando un proxy che viene eseguito come root per fare la comunicazione e quindi è quello che regola l'accesso a questo dispositivo? –

+1

L'accesso USB in Android significa avere l'autorizzazione per accedere a/dev/bus/usb/*. Questa autorizzazione viene stabilita staticamente tramite manifest. Puoi accedere direttamente ai dispositivi tramite NDK, ma ogni dispositivo Android ha diversi chip hardware USB, driver, ecc. Penso che l'unico modo per far funzionare un'app sui dispositivi Android sia tramite l'interfaccia host Java SDK supportata, che utilizza il i driver del venditore. Vedi [libusb su Android] (http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –

+2

Questa risposta è errata, come la capacità di passare i descrittori di file attraverso socket unix (un'abilità anche duplicato nel proprio IP di Binder di Android, quindi chiaramente non è una possibilità imprevista) fornisce di fatto un modo limitato per trasferire i permessi. –

Problemi correlati