2012-07-16 26 views
21

भेज रहा है मैं एंड्रॉइड डिवाइस में ब्लूटूथ पर एक फाइल भेजने की कोशिश कर रहा हूं। मैंने डिस्कवरी, कनेक्शन किया है और ब्लूटूथ सॉकेट बनाया है। समस्या यह है कि जब मैं ब्लूटूथ सॉकेट की आउटपुट स्ट्रीम में बाइट सरणी लिख रहा हूं, तो प्राप्तकर्ता पक्ष को कुछ भी प्राप्त नहीं होता है हालांकि यह स्वीकार करता है कि कुछ भेजा जा रहा है।एंड्रॉइड ब्लूटूथ फ़ाइल

यहाँ Iam कर (बुरा ब्लूटूथ एडाप्टर है)

कृपया सलाह है।

try 
    { 
     BluetoothDevice dev = bad.getRemoteDevice(a); 
     bad.cancelDiscovery(); 

     dev.createRfcommSocketToServiceRecord(new UUID(1111, 2222)); 
     Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
     bs = (BluetoothSocket) m.invoke(dev, Integer.valueOf(1)); 
     bs.connect(); 
     tmpOut = bs.getOutputStream(); 
    }catch(Exception e) 
    { 

    } 

    File f = new File(filename); 

    byte b[] = new byte[(int) f.length()]; 
    try 
    { 
     FileInputStream fileInputStream = new FileInputStream(f); 
     fileInputStream.read(b); 
    }catch(IOException e) 
    { 
     Log.d(TAG, "Error converting file"); 
     Log.d(TAG, e.getMessage()); 
    } 

    try { 
     tmpOut.write(b); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

इसके लिए आप क्या करते हैं: dev.createRfcommSocketToServiceRecord (नया UUID (1111, 2222)) ;? आप इसका उपयोग किए बिना यूयूआईडी का उपयोग करके ब्लूटूथ सॉकेट बनाते हैं। विधि m = dev.getClass()। GetMethod ("createRfcommSocket", नई कक्षा [] {int.class}); बीएस = (ब्लूटूथ सॉकेट) m.invoke (dev, Integer.valueOf (1)); RfComm चैनल 1 पर एक ब्लूटूथ सॉकेट खोलता है। तो केवल तभी जब आप जिस डिवाइस को फ़ाइल भेजने की कोशिश कर रहे हैं, वह इस चैनल को सुन रहा है, तो आप फ़ाइल – Weeman

+0

फ़ाइल प्राप्त कर पाएंगे ठीक है, मैंने अभी उस पंक्ति को हटा दिया है लेकिन अभी भी काम नहीं करता है। मैंने डीबगर मोड लॉन्च किया और यह मुझे दिखाता है कि मेरा tmpOut (outputstream) शून्य है। तो क्या इसका मतलब है मेरे ब्लूटूथ सॉकेट के साथ एक समस्या? क्या डिवाइस डिफ़ॉल्ट रूप से आरएफसीओएम चैनल 1 पर सुनता है या क्या मुझे रिसीवर डिवाइस में रिसीवर भी होना चाहिए? मैं सिर्फ एक फाइल भेजना चाहता था जिसे किसी अन्य फोन की डिफ़ॉल्ट ब्लूटूथ सेवा द्वारा प्राप्त किया जा सके। – exorcist

+1

फ़ाइल ट्रांसफर जैसे सामान्य एप्लिकेशन तथाकथित ब्लूटूथ प्रोफाइल (http://en.wikipedia.org/wiki/Bluetooth_profile) में निर्दिष्ट हैं, इसलिए यदि आप "डिफ़ॉल्ट ब्लूटूथ सेवा" का उपयोग करके फ़ाइल को स्थानांतरित करना चाहते हैं तो आपको इसे करना होगा OBEX प्रोफ़ाइल जो फ़ाइलों को ट्रांसफर करने के लिए उपयोग की जाती है (http://en.wikipedia.org/wiki/OBEX) – Weeman

उत्तर

0

यह हो सकता है क्योंकि देव और bs tmpout से पहले क्षेत्र से बाहर जाने के लिए किया जाता है, क्योंकि वे अपने आज़माएं/कैच ब्लॉक के भीतर घोषित कर रहे हैं।

3

मैं रिमोट ब्लूटूथ डिवाइस में सीरियल सेवा से कनेक्ट करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं और यह मेरे लिए ठीक काम कर रहा है।

UUID serialUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
BluetoothDevice btDevice = btAdapter.getRemoteDevice(BTAddress); // Get the BTAddress after scan 
BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord(SERIAL_UUID); 
btSocket.connect(); 
InputStream iStream = btSocket.getInputStream(); 
OutputStream oStream = btSocket.getOutputStream(); 

सर्वर साइड: बस यह सुनिश्चित करें कि अन्य डिवाइस (मोबाइल या पीसी हो सकता है) ब्लूटूथ पर धारावाहिक संचार के लिए एक सर्वर सॉकेट (नीचे सर्वर साइड कोड को देखने)

क्लाइंट साइड है बनाना :

UUID serialUUID = new UUID("1101", true); 
String serviceURL = "btspp://localhost:" + serialUUID 
     + ";name=Android BT Server;authorize=false;authenticate=false"; 
StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector 
         .open(serviceURL); 
// Blocking method will wait for client to connect 
StreamConnection connection = connectionNotifier.acceptAndOpen(); 

RemoteDevice remoteDevice = RemoteDevice.getRemoteDevice(connection); 
InputStream btInput = connection.openInputStream(); 
OutputStream btOutput = connection.openOutputStream(); 
+0

बाहर नहीं निकलता है, अगर मैं ब्लूटूथ प्रिंटर एडाप्टर (उदा। एचपी बीटी 500) में डेटा भेजना चाहता हूं, तो मैं सर्वर साइड कोड कहां लिख सकता हूं? – FARID

1

क्यों जैसे बजाय प्रतिबिंब के माध्यम से बुला के मानक API कॉल का उपयोग नहीं,:

BluetoothSocket socket = destination 
           .createRfcommSocketToServiceRecord(new UUID(...)) ; 

इसके अलावा आपका कैच ब्लॉक खाली है। क्या आप सुनिश्चित हैं कि सॉकेट बिना किसी अपवाद के जुड़ा हुआ था? कनेक्शन किसी कारण से विफल होने पर कनेक्ट IOException फेंक देगा। यह link

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