2011-03-15 15 views
18

rfcomm soketini emniyetli bir şekilde bağlamayı düşünüyorum. Aşağıda belirtilen yolu bulmak istedim:Android'de Güvenli Olmayan RFCOMM Soketi nasıl oluşturulur?

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 
tmp = (BluetoothSocket) m.invoke(device, 1); 

Bu şu an için istediğimi yapıyor. here üzerindeki belgeler bile, güvenli olmayan bağlantılar için createInsecureRfcommSocketToServiceRecord kullanmamız gerektiğini söylüyor. Fakat böyle bir yöntem yoktur. Bulduğum tek yol, yukarıda gösterildiği gibi yansıma kullanmaktı. Ve bu bile olsa createInsecureRfcommSocket geçirilen ve createInsecureRfcommSocketToServiceRecord yöntemi değil. Sadece bu şekilde ne kadar güvenilir olduğunu bilmek istedim. Yöntemde createInsecureRfcommSocketToServiceRecord'dan bahsedersem bağlantı asla olmaz.

cevap

29

createInsecureRfcommSocketToServiceRecord() Android API Level 10 ile başlayan dahil gördünüz mü, bu yüzden dokümantasyon dokümanlar daima API en son sürümünü izleyin beri kullanmaya teşvik edecektir. 10'dan küçük bir API (a.k.a. 2.3.3 veya Gingerbread) hedefliyorsanız, o yöntem herkese açık olarak erişilemez.

Yansıma yoluyla çağıran yöntem createInsecureRfcommSocket(), BluetoothDevice içinde, kabaca Android 2.0'dan beri mevcut olan özel bir yöntemdir. Gizli yöntemlerin çağrılması ile ilgili sorun, tüm cihazlarda ya da gelecekte bu cihazlarda olmalarının garanti edilmemesidir ... bu yüzden biraz kumar oynuyorsunuz. Tahminimce, yönteminiz çoğu 2.0+ cihazda çoğu zaman çalışacaktır, çünkü kamu kuzeni createRfcommSocketToServiceRecord()'u uygulamak için gereken hizmetler yığın katmanında çok benzerdir.

Alt satırda, Bluetooth uygulamanızla evrensel bir uyumluluk sağlamak istiyorsanız, uygulamanızla birlikte 2.3.3 (API Düzey 10) hedeflemeniz gerekir. Artık güvenli olmayan RFCOMM için açıkta bulunan bir genel API ile, temeldeki özel uygulamanın değişme olasılığının az mı yoksa daha az mı olduğunu söylemek zor.

+0

Doğru yöne işaret ettiğin için çok teşekkürler. Bu API yalnızca API düzey 10'dan beri kullanılabilirse, Android 2.1 – sunil

+3

ATM'yle geliştirdiğimde güvenli bir şekilde cihazlara nasıl bağlanırım, en iyi uzlaşmayı buldunuz. Yansıma çözümünün sonraki sürümlerde çıkabileceğini aklınızdan çıkarmayın. Bu nedenle, kodunuzu "Build.VERSION" ile cihazdaki sürümü kontrol etmek ve 2.3 ve üstü için genel API'yi kullanmak için kodunuzu yazabilirsiniz.Bu, hedef API Düzeyinizi 10'a yükseltmenizi gerektirir, ancak minimum API Seviyenizi 5 (veya 7) olarak bırakın, böylece 2.1 veya 2.2'yi çalıştıran daha önceki cihazlarda çalışmaya devam eder. Umarım yardımcı olur! – Devunwired

+0

@Wireless, ancak API 7'deki createInsecureRfcommSocketToServiceRecord() yöntemiyle çalışacak mı? –

0
+0

@ Mr Dennis Mathews, bu bağlantıya bir göz atmanız için size ihtiyacım var –

+0

http://stackoverflow.com/questions/6872451/android-bluetooth-connection-issue –

5

Yanıtların çoğuna burada, 30 Mart 2011'den önce, bu yazıya dahil.

Uygulamamda benzer sorunun çözümü için bakarken, ben hala SO

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/ bu sorunun çözüm arıyorsanız herkese yardımcı olacaktır

30 Mart'ta yazılı bu blogu bulduk

Çözüm şimdi çok basit hale geldi. Projenize InsecureBluetooth.java'yı ekleyin ve BluetoothChatService.java'da 2 satırı değiştirin.

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true); 

ve

tmp = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true); 

Thats it!

+4

bağlantı 404'tür – Rafay

İlgili konular