2012-12-20 6 views
5

पर लागू नहीं होती है, मैं एंड्रॉइड के यूएसबी होस्ट एपीआई के माध्यम से किसी डिवाइस के साथ संवाद करने की अनुमति प्राप्त करने में सक्षम था।एंड्रॉइड.hardware.usb के माध्यम से प्राप्त यूएसबी अनुमति एनडीके

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 के लिए आवश्यक है) नहीं देता है। रूट से जावा से एनडीके तक अनुमतियों को "स्थानांतरित" करने का कोई तरीका है?

पीएस मैं मूल फ़ाइल डिस्क्रिप्टर को जावा से एंड्रॉइड मूल निष्पादन योग्य में स्थानांतरित करने के लिए यूनिक्स सॉकेट का उपयोग कर समाप्त हुआ (मेरे पास https://github.com/martinmarinov/rtl_tcp_andro- पर प्रोजेक्ट जीएनयू-एड है)। कुछ लोगों के लिए यह आसान होगा क्योंकि वे सीधे डिवाइस से कनेक्ट करने के लिए एनडीके का उपयोग कर रहे हैं (तीसरे पक्ष के ऐप नहीं) और इसलिए जावा में उपयोग किए जाने वाले पॉइंटर को अभी भी एनडीके द्वारा बिना गड़बड़ किए पहुंचा जा सकता है यूनिक्स सॉकेट।

उत्तर

2

अनुमतियों का कोई "स्थानांतरण" संभव नहीं है क्योंकि एंड्रॉइड सुरक्षा मॉडल मांग करता है कि प्रत्येक एप्लिकेशन स्थैतिक रूप से इसकी आवश्यक अनुमतियां घोषित करे और उपयोगकर्ता इंस्टॉल समय पर अनुमति सेट को मंजूरी दे। कोई गतिशील अनुमति समर्थित नहीं है। प्रत्येक ऐप मैप्स को एक यूआईडी में मैप करता है, जिसमें मैनिफेस्ट में इसकी स्थाई रूप से घोषित अनुमतियां होती हैं। जावा एक अनुमति सीमा नहीं है, और Dalvik वीएम एनडीके के माध्यम से देशी कोड चलाने के लिए कोई बाधा नहीं है। सभी अनुमतियों को मैनिफेस्ट में सूचीबद्ध किया जाना चाहिए, और एपीके में कोई जावा (डीईएक्स) कोड नहीं हो सकता है।

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

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

+0

तो तुम मतलब है कि जब भी मैं जावा यूएसबी होस्ट एपीआई के माध्यम से USB डिवाइस तक पहुँचने कर रहा हूँ, मैं वास्तव में एक प्रॉक्सी है कि संचार करने के लिए रूट के रूप में चलाता है का उपयोग कर रहा है और इसलिए यह एक है यह इस डिवाइस तक पहुंच को नियंत्रित कर रहा है? –

+1

एंड्रॉइड में यूएसबी एक्सेस का मतलब है/dev/bus/usb/* तक पहुंचने की अनुमति है। यह अनुमति मैनिफेस्ट के माध्यम से स्थिर रूप से स्थापित की गई है। आप एनडीके के माध्यम से उपकरणों तक सीधे पहुंच सकते हैं, लेकिन प्रत्येक एंड्रॉइड डिवाइस में अलग-अलग यूएसबी हार्डवेयर चिप्स, ड्राइवर इत्यादि हैं। मुझे लगता है कि एंड्रॉइड डिवाइस पर ऐप के काम करने का एकमात्र तरीका समर्थित जावा एसडीके होस्ट इंटरफेस के माध्यम से है, जो इसका उपयोग करता है विक्रेता के ड्राइवर। देखें [एंड्रॉइड पर libusb] (http://libusb.6.n5.nabble.com/libusb-on-Android-td4997105.html) –

+2

यह उत्तर गलत है, यूनिक्स सॉकेट के माध्यम से फ़ाइल डिस्क्रिप्टर को पास करने की क्षमता (एक क्षमता एंड्रॉइड के अपने बाइंडर आईपीसी में भी डुप्लिकेट किया गया है, इसलिए स्पष्ट रूप से एक अप्रत्याशित संभावना नहीं है) वास्तव में अनुमतियों को स्थानांतरित करने के लिए सीमित तरीका प्रदान करता है। –

संबंधित मुद्दे