2012-12-07 22 views
7

प्राप्त करने में विफल रहा है, मैं अपने ऐप में ब्लूटूथ का उपयोग कर समस्या में भाग रहा हूं। ऐसा लगता है कि 28 BluetoothSocket/BluetoothServerSockets के बाद बनाया गया है, सभी बंदरगाहों को लिया जाता है। सॉकेट को एक साथ खोले जाने की आवश्यकता नहीं है, ब्लूटूथ सक्षम होने के बाद से केवल 28 सॉकेट हैं।एंड्रॉइड: ब्लूटूथ पोर्ट नंबर

इसे Android Samples में प्रदान किए गए ब्लूटूथकैट नमूने का उपयोग करके पुन: उत्पन्न किया जा सकता है। बस ऐप को 15 बार खोलें और बंद करें (ऐप हर बार 2 सॉकेट बनाता है)। 15 वीं समय पर, यह दुर्घटना होगा और और दोबारा सक्षम नहीं ब्लूटूथ जब तक आप को निष्क्रिय दुर्घटना के लिए जारी रहेगा तो:

12-06 18:43:58.177: E/BluetoothSocket(18530): bindListen, fail to get port number, exception: java.io.IOException: read failed, socket might closed, read ret: -1 
12-06 18:43:58.193: E/BluetoothChatService(18530): Socket Type: Insecurelisten() failed 
12-06 18:43:58.193: E/BluetoothChatService(18530): java.io.IOException: Error: -1 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:1035) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.bluetooth.BluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(BluetoothAdapter.java:982) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService$AcceptThread.<init>(BluetoothChatService.java:280) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChatService.start(BluetoothChatService.java:119) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at com.example.android.BluetoothChat.BluetoothChat.onResume(BluetoothChat.java:131) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.Activity.performResume(Activity.java:5182) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.os.Looper.loop(Looper.java:137) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at java.lang.reflect.Method.invoke(Method.java:511) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-06 18:43:58.193: E/BluetoothChatService(18530): at dalvik.system.NativeStart.main(Native Method) 

वहाँ के बाद सॉकेट बंद कर दिया है बंदरगाहों को मुक्त करने के कोई तरीका है?

उत्तर

6

मैं इस व्यवहार को उस डिवाइस पर सत्यापित कर सकता हूं जो मेरे पास है; यद्यपि एक ही तरह से दुर्घटनाग्रस्त होने की आवश्यकता डिवाइस की तरह अलग-अलग होती है (मुझे लगता है कि गैलेक्सी नेक्सस 4.2 पर 20-25 बार आवश्यक था) ताकि पोर्ट हैंडल की उपलब्ध संख्या अलग-अलग दिखाई दे। मैं सूचना का भी योगदान कर सकता हूं कि यह मुद्दा नमूना ऐप (या उस मामले के लिए आपका ऐप) में मेमोरी रिसाव नहीं है क्योंकि BluetoothSocket के सभी उदाहरणों को दल्विक द्वारा जारी और बंद कर दिया गया है। यहां सूचीबद्ध चरणों में केवल BluetoothServerSocket पर समस्या का परीक्षण किया गया है, इसलिए यह स्पष्ट नहीं है कि समस्या विशेष रूप से उससे संबंधित है, हालांकि यह असंभव प्रतीत होता है।

कम से कम मेरे डिवाइस पर, आप ब्लूटूथ एडाप्टर की स्थिति को टॉगल करने तक फिर से ऐप शुरू नहीं कर सकते हैं, इसलिए समस्या निश्चित रूप से स्टैक पर कनेक्शन के अंतर्निहित प्रबंधन में है।

मैं http://b.android.com को पुन: पेश करने के लिए चरणों के साथ एक बग फाइल करूंगा और मुझे इसे ऊपर उठाने में खुशी होगी।

+1

एक नज़र डालने के लिए धन्यवाद! मैंने यहां एक बग दायर किया है: [# 41110] (http://code.google.com/p/android/issues/detail?id=41110)। मेरे गैलेक्सी नेक्सस और मेरे नेक्सस 7 पर 4.2.1 चल रहे ऐप को क्रैश करने में 15 बार लग गए। मेरा नेक्सस वन कभी दुर्घटनाग्रस्त नहीं हुआ, इसलिए उम्मीद है कि यह केवल एक जेबी मुद्दा है। – mattprecious

0

हाल ही में, मुझे इसके समाधान के साथ आने में डूबना पड़ा। एंड्रॉइड को अपग्रेड करना एक विकल्प नहीं था।

यह पता चला है कि अगर मैकसेप्ट थ्रेड को नष्ट करने और पुनर्निर्माण करने की बजाय प्रत्येक बार एक कनेक्शन स्थापित/टूटा हुआ है, तो मूल उदाहरण रखें और इसका पुन: उपयोग करें। यह आपके ऐप पर बग के प्रभाव को कम करता है।

BluetoothChatService फ़ाइल से, जुड़ा हुआ() फ़ंक्शन में, mAcceptThread रद्द कर सकता हूँ नहीं:

public synchronized void connected(BluetoothSocket socket, BluetoothDevice device) { 
... 
... 
... 
// Cancel the accept thread because we only want to connect to one device 
//(Rather stay listening so comment out the cancel line!!) 
//If necessary, use some other state to prevent a second connection. 
//DONT CANCEL: if (mAcceptThread != null) {mAcceptThread.cancel(); mAcceptThread = null;} 
... 
... 

AcceptThread कक्षा में, समय में पाश को संशोधित() फ़ंक्शन:

  // Listen to the server socket if we're not connected 
//OLD LOOP:   while (mState != STATE_CONNECTED) 
//(Rather use STATE_NONE so the loop will only stop when the service does) 
      while (mState != STATE_NONE) 

विचार को सही तरीके से कार्यान्वित करने के लिए आपके कोड में अन्य चीजें हो सकती हैं।

0

फिर से कनेक्ट करने के लिए मैं टुकड़ा में एक समय हैंडलर में उपयोग करें:

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MainActivity.mac); 
        // Attempt to connect to the device 
        mChatService.connect(device, true); 

इस मुद्दे को हल करने के लिए "विफल रहता है और अधिक से अधिक 28 बार के लिए जब फिर से जोड़ने के" मैं हर बार टिप्पणी की सेवा फिर से शुरू होता है खुद जब खो कनेक्शन:

//BluetoothChatService.this.start(); 

भी मैं सभी भागों पर टिप्पणी की है, जहां सॉकेट बंद कर देता है:

//socket.close(); 

//mmServerSocket.close(); 

//mmSocket.close(); 

//mSecureAcceptThread.cancel(); 

और स्वीकार करते हैं थ्रेड के लिए एक अशक्त नहीं पता लगाने जोड़ा गया है और ठेड विफल नहीं जुड़ा:

if(mAdapter != null) { 
         tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, 
           MY_UUID_SECURE); 
        }else{ 
         mAdapter = BluetoothAdapter.getDefaultAdapter(); 
         //mState = STATE_NONE; 
        } 

और

if(mmServerSocket != null) { 
         socket = mmServerSocket.accept(); 
        } 

फिर भी मैं यादृच्छिक कनेक्शन चला जाता है मिलता है, लेकिन सेवा फिर से जोड़ता है और सब कुछ काम करता है।

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