2012-12-20 22 views
5

Udało mi się uzyskać pozwolenie na komunikację z urządzeniem za pośrednictwem interfejsu USB Host API systemu Android.Uprawnienia USB uzyskane przez android.hardware.usb nie dotyczą 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); 
       } 
      } 
     } 
    } 
}; 

Niestety nie daje moje pozwolenie kodu NDK do bezpośredniego komunikowania się z tym urządzeniem (co jest potrzebne dla libusb). Czy istnieje sposób "przeniesienia" uprawnień z Java na NDK bez uprawnień roota?

P.S. Skończyło się na użyciu gniazd UNIX do przeniesienia oryginalnego File Descirptor z Java do natywnego pliku wykonywalnego Android (mam GNU-ed projektu https://github.com/martinmarinov/rtl_tcp_andro-). Dla niektórych osób byłoby to jeszcze łatwiejsze, ponieważ mogą oni używać NDK do bezpośredniego łączenia się z urządzeniem (nie jest to aplikacja innej firmy), a zatem wskaźnik, którego używają w Javie, może być nadal dostępny przez NDK bez konieczności bałagania z Gniazda UNIX.

Odpowiedz

2

Nie ma możliwości "przeniesienia" uprawnień, ponieważ model zabezpieczeń systemu Android wymaga, aby każda aplikacja statycznie zadeklarowała wymagane uprawnienia, a użytkownik zatwierdził zestaw uprawnień w czasie instalacji. Żadne uprawnienia dynamiczne nie są obsługiwane. Każda aplikacja jest mapowana do pojedynczego identyfikatora użytkownika z jego statycznie zadeklarowanymi uprawnieniami w manifeście. Java nie jest granicą uprawnień, a Dalvik VM nie stanowi żadnej przeszkody dla uruchamiania natywnego kodu za pośrednictwem NDK. Wszystkie uprawnienia muszą znajdować się w manifeście, a apk może w ogóle nie zawierać kodu Java (dex).

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

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

+0

Więc oznacza to, że gdy mam dostępu do urządzenia USB przez Java USB Host API, ja faktycznie przy użyciu serwera proxy, który jest uruchamiany jako root, aby wykonać komunikację i dlatego jest to jeden to jest zarządzanie dostępem do tego urządzenia? –

+1

Dostęp przez USB w systemie Android oznacza posiadanie pozwolenia na dostęp do/dev/bus/usb/*. Zezwolenie to jest ustalane statycznie za pośrednictwem manifestu. Możesz uzyskać bezpośredni dostęp do urządzeń za pośrednictwem NDK, ale każde urządzenie z Androidem ma inne układy sprzętowe USB, sterowniki itp. Myślę, że jedynym sposobem na to, by aplikacja działała na urządzeniach z Androidem, jest obsługiwany interfejs hosta Java SDK, który używa sterowniki dostawcy. Zobacz [libusb na Androida] (http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –

+2

Ta odpowiedź jest błędna, jako możliwość przekazywania deskryptorów plików przez gniazda uniksowe (zdolność również powielone w Binder IPC własnego Androida, więc wyraźnie nie jest to nieprzewidziane możliwości) w rzeczywistości zapewnia ograniczony sposób przenoszenia uprawnień. –