मैं अपने एंड्रॉइड फोन और किसी अन्य डिवाइस के बीच एक यूएसबी एक्सेसरी कनेक्शन स्थापित कर रहा हूं। परीक्षण के लिए अभी बस बाइट भेजना। मुझे पहले कुछ निश्चित संचार मिल रहा है, लेकिन यह एक या दूसरे के बाद Java.io.IOException: write failed: EBADF (Bad file number)"
के साथ हमेशा मर जाता है। कभी-कभी पढ़ना जिंदा रहता है लेकिन लेखन मर जाता है; अन्य दोनों मर जाते हैं।Java.io.IOException, "खराब फ़ाइल संख्या" यूएसबी कनेक्शन
मैं कुछ भी सुपर फैंसी नहीं कर रहा हूँ, पढ़ना और सिर्फ गूगल प्रलेखन की तरह लेखन:
प्रारंभिक कनेक्शन (एक प्रसारण रिसीवर के अंदर, मैं जानता हूँ कि इस हिस्से कम से कम शुरू काम करता है):
if (action.equals(ACTION_USB_PERMISSION))
{
ParcelFileDescriptor pfd = manager.openAccessory(accessory);
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
mIn = new FileInputStream(fd);
mOut = new FileOutputStream(fd);
}
}
पढ़ना:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
byte[] buf = new byte[BUF_SIZE];
while (true)
{
try {
int recvd = mIn.read(buf);
if (recvd > 0) {
byte[] b = new byte[recvd];
System.arraycopy(buf, 0, b, 0, recvd);
//Parse message
}
}
catch (IOException e) {
Log.e("read error", "failed to read from stream");
e.printStackTrace();
}
}
}
});
thread.start();
लेखन:
synchronized(mWriteLock) {
if (mOut !=null && byteArray.length>0) {
try {
//mOut.flush();
mOut.write(byteArray, 0, byteArray.length);
}
catch (IOException e) {
Log.e("error", "error writing");
e.printStackTrace();
return false;
}
}
else {
Log.e(TAG, "Can't send data, serial stream is null");
return false;
}
}
त्रुटि स्टैकट्रेस:
java.io.IOException: write failed: EBADF (Bad file number)
W/System.err(14028): at libcore.io.IoBridge.write(IoBridge.java:452)
W/System.err(14028): at java.io.FileOutputStream.write(FileOutputStream.java:187)
W/System.err(14028): at com.my.android.transport.MyUSBService$5.send(MyUSBService.java:468)
W/System.err(14028): at com.my.android.transport.MyUSBService$3.onReceive(MyUSBService.java:164)
W/System.err(14028): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:781)
W/System.err(14028): at android.os.Handler.handleCallback(Handler.java:608)
W/System.err(14028): at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(14028): at android.os.Looper.loop(Looper.java:156)
W/System.err(14028): at android.app.ActivityThread.main(ActivityThread.java:5045)
W/System.err(14028): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(14028): at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(14028): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
W/System.err(14028): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
W/System.err(14028): at dalvik.system.NativeStart.main(Native Method)
W/System.err(14028): Caused by: libcore.io.ErrnoException: write failed: EBADF (Bad file number)
W/System.err(14028): at libcore.io.Posix.writeBytes(Native Method)
W/System.err(14028): at libcore.io.Posix.write(Posix.java:178)
W/System.err(14028): at libcore.io.BlockGuardOs.write(BlockGuardOs.java:191)
W/System.err(14028): at libcore.io.IoBridge.write(IoBridge.java:447)
W/System.err(14028): ... 13 more
मैं हर जगह प्रवेश करने की है और इस तरह मैं जानता हूँ कि यह इस तरह एक और अनुमति अनुरोध प्राप्त की जा रही (और इस प्रकार फ़ाइल धाराओं के मध्य पढ़ इसे पुनः शुरू किया जा रहा) के रूप में कुछ भी भी स्पष्ट नहीं है । धाराएं या तो बंद नहीं हो रही हैं, क्योंकि मेरे पास कभी भी मेरे कोड में कहीं भी ऐसा नहीं होता है (अभी के लिए)। मुझे कोई अलग या संलग्न घटनाएं नहीं मिल रही हैं (मैं लॉग इन करता हूं अगर ऐसा होता है)। साधारण से कुछ भी नहीं लगता है; यह बस मर जाता है।
मैंने सोचा कि शायद यह एक सहमति मुद्दा था, इसलिए मैंने ताले के साथ खेला और सोया, मैंने कोशिश की कि कुछ भी नहीं किया। मुझे नहीं लगता कि यह एक थ्रूपुट मुद्दा है क्योंकि यह तब भी होता है जब मैं हर पठन (दोनों सिरों पर) सोता हूं, और एक समय में एक सिंगल पैकेट पढ़ता हूं (सुपर धीमी बिटरेट)। क्या किसी मौके पर बफर को दूसरे छोर पर ओवरराउन किया जा रहा है? मैं इसे साफ़ करने के बारे में कैसे जाउंगा? मेरे पास दूसरे सिरे के कोड तक पहुंच है, यह होस्ट मोड का उपयोग करके एक एंड्रॉइड डिवाइस भी है। यदि यह महत्वपूर्ण है, तो मैं उस कोड को भी पोस्ट कर सकता हूं - मानक थोक हस्तांतरण।
क्या फ़ोन के पास एंड्रॉइड एक्सेसरी मोड के लिए कम समर्थन है? मैंने दो फोनों की कोशिश की है और वे दोनों समान रूप से असफल हो जाते हैं, इसलिए मुझे संदेह है कि यह है।
मुझे आश्चर्य है कि एंड्रॉइड पर यूएसबी से लिखते या पढ़ने के दौरान सामान्य रूप से यह त्रुटि क्या होती है?
एंड्रॉइड का कौन सा संस्करण आप उपयोग कर रहे हैं? इसके अलावा, आप किसके साथ संवाद करने की कोशिश कर रहे हैं? मेरा मानना है कि एक्सेसरी मोड के साथ (क्या आप एंड्रॉइड ओपन एक्सेसरी मोड का उपयोग कर रहे हैं?) आपको एक मेजबान डिवाइस की आवश्यकता है जो arduino या FT311D जैसा संगत है। – TronicZomB
एंड्रॉइड 4.0.4। मैं प्रारंभिक कनेक्शन को ठीक कर सकता हूं, और "संगत" डिवाइस जैसी कोई चीज़ नहीं है - यदि आप सही नियंत्रण अनुरोध भेजते हैं, तो फ़ोन सहायक उपकरण में जाता है यदि यह इसका समर्थन करता है। एक संवाद मेरे फोन पर बताता है कि यह एक सहायक को देखता है - कनेक्शन को रखने में समस्याएं हैं। –
ओह ठीक है, प्रतीक्षा करें कि यह एक सहायक को देखता है, जिसका अर्थ है कि आपका फोन होस्ट मोड में है, तो एक्सेसरी मोड सही नहीं है? कौन सा डिवाइस बिजली, फोन टू डिवाइस या डिवाइस को फोन प्रदान कर रहा है? – TronicZomB