2012-12-20 69 views
5

我能夠獲得通過Android的USB Host API的設備進行通信的許可。USB許可並不適用於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); 
       } 
      } 
     } 
    } 
}; 

不幸的是,我的NDK代碼沒有權限直接與這個設備通信(這是libusb需要的)。有沒有辦法將權限從Java轉移到沒有root權限的NDK?

P.S. 我結束了使用Unix套接字從Java的原始文件Descirptor轉移到Android原生可執行文件(我有GNU-ED項目在https://github.com/martinmarinov/rtl_tcp_andro-)。 對於一些人來說,它會更容易,因爲他們可能使用NDK直接與設備連接(而不是第三方應用程序),因此他們在Java中使用的指針仍然可以被NDK訪問,而不必亂搞UNIX套接字。

回答

2

沒有可能的權限的「轉移」,因爲Android安全模型需要每個應用程序靜態地聲明其所需的權限和用戶批准在安裝時設置的權限。不支持動態權限。每個應用都映射到單個UID,並在清單中具有靜態聲明的權限。 Java不是許可界限,Dalvik VM不是通過NDK運行本地代碼的障礙。所有權限必須列在清單中,並且apk可能根本不包含Java(dex)代碼。

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

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

+0

所以你的意思是,每當我訪問通過Java USB主機API usb設備,我確實使用了以root身份運行做通信的代理,因此它是一個這是治理這個設備的訪問? Android中 –

+1

USB存取裝置具有權限訪問的/ dev /總線/ USB/*。此權限是通過清單靜態建立的。你可以通過NDK設備直接訪問,但每個Android設備都有不同的USB硬件芯片,驅動程序等我想對於一個應用程序在Android設備上工作的唯一方法是通過支持的Java SDK主機接口,它使用供應商的司機。請參閱[Android上的libusb](http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –

+2

這個答案是錯誤的,因爲通過unix套接字傳遞文件描述符的能力也重複在Android的自身粘合劑IPC,所以顯然不是不可預見的可能性),事實上確實提供轉讓權限以有限的方式。 –