2012-08-22 14 views
5

के माध्यम से ब्लूटूथ द्वारा फ़ाइल प्राप्त करें मेरे पास डिवाइस है जो OBEX ऑब्जेक्ट पुश प्रोफाइल (ओपीपी) का उपयोग करके ब्लूटूथ के माध्यम से डेटा भेजता है।OBEX ऑब्जेक्ट पुशप्रोफाइल

adb logcat मैं देखता हूँ कि मेरे Android डिवाइस एक कनेक्शन प्राप्त करता है का उपयोग करना (लेकिन गर्भपात इस संबंध?)

08-22 11:14:37.939: I/BtOppRfcommListener(22586): Accepted connectoin from 00:07:CF:5F:52:A0 
08-22 11:14:37.939: I/BtOpp Service(22586): Start Obex Server 
08-22 11:14:38.109: D/Obex ServerSession(22586): java.io.IOException: Software caused connection abort 
08-22 11:14:38.109: D/PowerManagerService(180): @PowerManagement: 'BtOppObexServer' releaseWakeLock when screen locked 
08-22 11:14:39.219: D/BluetoothEventLoop(180): Device property changed: 00:07:CF:5F:52:A0 property: Connected value: false 

जब मैं ब्लूटूथ फ़ाइल स्थानांतरण (बाजार से नि: शुल्क आवेदन) स्थापित तो मैं फ़ाइलों को प्राप्त करने में सक्षम हूँ । लेकिन मैं अन्य एप्लिकेशन इंस्टॉल नहीं करना चाहता हूं।

+0

क्या आप कोड को प्रश्न में पोस्ट कर सकते हैं ताकि SO पर एंड्रॉइड विशेषज्ञों को वें देख सकें ई मुद्दा? –

+0

क्या इससे मदद मिलती है? http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not-working – domsom

+0

@domsom मैंने बिना सफलता के समान कोड की कोशिश की है। आईएमओ समस्या यह प्रतीत होती है कि मूल ब्लूटूथ अभी भी आने वाले ओपीपी डेटा को स्वीकार कर रहा है और कस्टम कोड ट्रिगर नहीं होता है। इसलिए समाधान में न केवल आने वाले कनेक्शनों को सुनना होगा बल्कि मूल ब्लूटूथ के साथ 'रजिस्टर' भी करना होगा ताकि कस्टम ओपीपी हैंडलर को बुलाया जा सके। –

उत्तर

2

मेरा मानना ​​है कि मेरे पास (कम से कम आंशिक) समाधान है जिसे फ़ाइलों को ओपीपी और कस्टम कोड के माध्यम से अवरुद्ध करने की अनुमति देनी चाहिए। पहला कदम चल> सेटिंग> एप्लिकेशन पर जाने के लिए है> Bluetooth साझा करें और मारने BluetoothOppService

तब मैं BluetoothAdapter (नीचे कोड) जो एक विशिष्ट पोर्ट पर ध्यान दे की अनुमति देता है पर एक विधि का उपयोग करने के प्रतिबिंब का इस्तेमाल किया। जिसके बाद हम इनकमिंग ओपीपी संचार को रोक सकते हैं और इनपुट और आउटपुट स्ट्रीम के साथ बातचीत कर सकते हैं। This अतः धागा OPP संचार भाग के साथ में मदद मिलेगी, लेकिन एक प्रारंभिक कदम के रूप में मैं डेटा स्ट्रीम पढ़ सकते हैं और यानी os.writeByte(ObexSession.OBEX_SUCCESS | ObexSession.OBEX_FINAL_BIT);

// simplified exception handling 
public class BluetoothAdapterProxy 
{ 
    public static final int CHANNEL_OPP = 12; 

    final BluetoothAdapter target; 
    static final Class<?> targetClass = BluetoothAdapter.class; 
    Method listenOn; 

    public BluetoothAdapterProxy(BluetoothAdapter target) 
    { 
     this.target = target; 
     Class<?>[] args = new Class[] { int.class }; 
     try 
     { 
      this.listenOn = targetClass.getDeclaredMethod(
       "listenUsingRfcommOn", args); 
     } 
     catch (NoSuchMethodException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public BluetoothServerSocket listenUsingRfcommOn(int channel) 
    { 
     try 
     { 
      return (BluetoothServerSocket) (listenOn.invoke(target, 
       new Object[] { channel })); 
     } 
     catch (Exception e) 
     { 
      // complain loud, complain long 
      throw new RuntimeException(ex); 
     } 
    } 
} 

प्रयोग एक OPP 'ठीक है' के संदेश के साथ reponded: का उपयोग कर आरंभ

serverSocket = new BluetoothAdapterProxy(BluetoothAdapter.getDefaultAdapter()) 
    .listenUsingRfcommOn(BluetoothAdapterProxy.CHANNEL_OPP); 

इसके बाद, अलग-अलग Thread (अवरुद्ध करने से रोकने के लिए) का उपयोग करें और दूरस्थ डिवाइस socket = serverSocket.accept();

+0

मुझे नहीं लगता कि आपको इसके लिए एक रैपर वर्ग की आवश्यकता क्यों है, लेकिन वैसे भी: आप OPP UUID '00001105-0000-1000-8000-00805f9b34fb' का उपयोग करके सार्वजनिक 'BluetoothDevice.listenUsingRfcommWithServiceRecord()' विधि का उपयोग करने में सक्षम हो सकते हैं। आपकी समस्या की कुंजी शायद यह है कि एक और (सिस्टम) सेवा पहले से ही ओबीएक्स चैनल पर सुन रही है। तो या तो आप अपने द्वारा बताए गए "मार" समाधान के साथ रह सकते हैं, या आप सिस्टम सेवा का उपयोग कर सकते हैं और इसे यहां की निगरानी कर सकते हैं: http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not- काम कर रहे – domsom

+0

रैपर वर्ग का उपयोग 'छुपा एंड्रॉइड एपीआई' से एक विधि तक पहुंचने के लिए किया जाता है, कोड जो रनटाइम पर दिखाई देता है लेकिन प्रकाशित एपीआई और android.jar से बाहर रखा गया है। मेरे पास प्रकाशित एपीआई की जांच करने वाली बड़ी संख्या में टेस्ट कोड है - सुनना कोई समस्या नहीं है हालांकि परीक्षणों में से कोई भी बाहरी ओपीपी डेटा का जवाब देने के लिए कस्टम कोड सक्षम नहीं कर पाया है। –

+0

मुझे यह भी उल्लेख करना चाहिए कि पोस्ट किया गया नमूना कोड एक पूर्ण समाधान नहीं है, क्योंकि मैंने पाया है कि यह अभी भी विभिन्न उपकरणों पर अलग-अलग व्यवहार करता है। यह मेरे एचटीसी वन एक्स पर ओपीपी के माध्यम से डेटा प्राप्त करने में सक्षम है, लेकिन सैमसंग नेक्सस एस और गैलेक्सी टैब 2 पर पूरी तरह से सफलतापूर्वक और पूरी तरह से सफलतापूर्वक व्यवहार नहीं करता है। –

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

  • कोई संबंधित समस्या नहीं^_^