2012-04-17 9 views
5

मैं ओटीजी केबल के साथ एक्सओओएम के साथ ओटीजी केबल का उपयोग कर बाहरी स्टोरेज फाइल सिस्टम पढ़ने के लिए आवेदन करने की कोशिश कर रहा हूं। मैं इस कोड का उपयोग कर रहा फ्लैश डिवाइसएंड्रॉइड यूएसबीहोस्ट फ्लैश ड्राइव

final UsbDeviceConnection connection = manager.openDevice(device); 
UsbInterface inf = device.getInterface(0); 
if (!connection.claimInterface(inf, true)) { 
    Log.v("USB", "failed to claim interface"); 
} 
UsbEndpoint epOut = null; 
UsbEndpoint epIn = null; 
// look for our bulk endpoints 
for (int i = 0; i < inf.getEndpointCount(); i++) { 
    UsbEndpoint ep = inf.getEndpoint(i); 
    if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
     if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { 
      epOut = ep; 
     } else { 
      epIn = ep; 
     } 
    } 
} 
if (epOut == null || epIn == null) { 
    throw new IllegalArgumentException("not all endpoints found"); 
} 
final UsbEndpoint inEndPoint = epIn; 

यह सामान्य काम करता है साथ संचार के लिए और बाहर endpoint निर्धारित करने के लिए। तो मैं FAT32 बूट क्षेत्र पाने के लिए

ByteBuffer arg1 = ByteBuffer.allocate(512); 
UsbRequest request = new UsbRequest(); 
request.initialize(connection, inEndPoint); 
request.queue(arg1, inEndPoint.getMaxPacketSize()); 
UsbRequest result = connection.requestWait(); // halt here 
connection.releaseInterface(inf); 
connection.close(); 

पहले 512 बाइट्स पढ़ने के लिए कोशिश कर रहा हूँ, लेकिन यह कनेक्ट किए गए डिवाइस से किसी भी डेटा को पढ़ने नहीं है। यह सब कोड अलग थ्रेड पर चलाने के प्रसारण रिसीवर में डिवाइस

PendingIntent mPermissionIntent = PendingIntent.getBroadcast(USBHostSampleActivity.this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
registerReceiver(mUsbReceiver, filter); 
manager.requestPermission(lDevices.get(position),mPermissionIntent); 

पर अनुमति granding के बाद मैं सिर्फ पिछले कोड के साथ नया धागा शुरू; मैं भी f0 डेटा और/या hwstats पाने के लिए libusb नमूने में USBDeviceConnection.controlTransfer

byte[] b = new byte[0x10]; 
int cTransfer = connection.controlTransfer(128, 6, 16, 0,b, 12, 0); 

की तरह करने के लिए कॉल करने के लिए करने की कोशिश की लेकिन यह हमेशा वापस आ -1 भी मैं bulkTransfers सिंक करने के लिए USBRequst का उपयोग कर async अनुरोध की जगह की कोशिश की लेकिन नतीजा है वही। क्या किसी ने एंड्रॉइड एसडीके के इस हिस्से के साथ काम किया है? धन्यवाद!

+0

मैं कुछ ऐसा करने की कोशिश कर रहा हूं - एक यूएसबी छिपा डिवाइस को ज़ूम चलाना आईसीएस से कनेक्ट करें। कुछ शोध करने के बाद, मुझे पता है कि यूएस-शिप किए गए ज़ूम में अधिकांश समय यूएसबी होस्ट एपीआई के साथ कोई समस्या नहीं है लेकिन किसी भी अन्य (जैसे ईयू या ऑस्ट्रेलिया-शिप किए गए) डिवाइसों में मेजबान एपीआई इस तरह से लागू होती है जो एक बनाने की अनुमति नहीं देती है नियंत्रण स्थानांतरण। मैं अलग-अलग छवियों के साथ अपने डिवाइस को फ्लैश करने की कोशिश कर रहा हूं, जब मैं आगे बढ़ता हूं तो मैं आपको बता दूंगा। क्या आपको कल से कुछ उपयोगी लगता है? – syntagma

+0

हां, मैं लगभग usbhost api का उपयोग कर fat32 पार्सिंग को कार्यान्वित करना समाप्त कर दिया। और मैं आपको बता सकता हूं कि आपको नियंत्रण ट्रांसफर का उपयोग करने की आवश्यकता नहीं है। आपको केवल bulk_transfer और छुपा आधिकारिक दस्तावेज – Alexandr

उत्तर

1

मुझे लगता है कि कहा जाता है libaums के लिए एक पुस्तकालय लिखा है: https://github.com/mjdev/libaums

पुस्तकालय निम्न स्तर यूएसबी संचार का ख्याल रखता है और FAT32 फाइल सिस्टम लागू करता है। इसमें एक उदाहरण ऐप भी शामिल है। एक निर्देशिका सूचीबद्ध करना निम्नानुसार काम करेगा:

UsbMassStorageDevice[] devices = UsbMassStorageDevice.getMassStorageDevices(this); 
device.init(); 

// we only use the first device 
device = devices[0]; 
// we always use the first partition of the device 
FileSystem fs = device.getPartitions().get(0).getFileSystem(); 
Log.d(TAG, "Capacity: " + fs.getCapacity()); 
Log.d(TAG, "Occupied Space: " + fs.getOccupiedSpace()); 
Log.d(TAG, "Free Space: " + fs.getFreeSpace()); 
UsbFile root = fs.getRootDirectory(); 

for(UsbFile f : root.listFiles()) 
    Log.d(TAG, f.getName()) 
+0

कौन सा उदाहरण ऐप है? क्या यह usbfileman है? मैंने ऐप चलाने की कोशिश की लेकिन ऐप को बंद करने के लिए मजबूर होना पड़ा। – doraemon

+1

हाँ usbfileman उदाहरण एप्लिकेशन है।अनुमतियों की जांच करें और सेटिंग्स में (उदाहरण ऐप नई एंड्रॉइड रनटाइम अनुमति प्राप्त करने का उपयोग नहीं करता है)। यदि आपके पास कोई त्रुटि लॉग है, तो आप github पर भी कोई समस्या सबमिट कर सकते हैं। – Magnus

4

ऐसा प्रतीत होता है कि आप एक संपूर्ण प्रोटोकॉल परत खो रहे हैं; आप डिवाइस से केवल 512 बाइट नहीं पढ़ सकते हैं। इसे वापस क्या भेजना चाहिए? यह कैसे पता चलेगा कि आप डिस्क की शुरुआत में पढ़ना शुरू करना चाहते हैं?

यूएसबी-एमएससी डिवाइस से आप वास्तव में स्मृति स्थान कैसे पढ़ते हैं डिवाइस उप वर्ग प्रकार और समर्थित परिवहन प्रोटोकॉल पर निर्भर करता है।

ऐसा लगता है कि एक सामान्य फ्लैश डिस्क USB Mass Storage Class Bulk-Only (BBB) Transport के साथ SCSI transparent command set का उपयोग करती है।

आपको यह पता लगाने के लिए डिवाइस डिस्क्रिप्टर की जांच करनी है कि आपका डिवाइस क्या समर्थन करता है। सभी संभावित मानों और उनके दस्तावेज़ों के संदर्भों के लिए MSC device class overview भी देखें।

+0

हे अलेक्जेंडर है, मैं भी इसी तरह के ऐप पर काम करने की कोशिश कर रहा हूं। क्या आप अपने लिंक अपडेट कर सकते हैं? वे अब मर गए प्रतीत होते हैं। – giannileuani

+0

@ user1949634 संकेत के लिए धन्यवाद। लिंक अपडेट किया गया। – Alexander

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