锘?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 无码人妻精品一区二区三18禁,亚洲国产日韩欧美一区二区三区,西西人体444www大胆无码视频

亚洲精品92内射,午夜福利院在线观看免费 ,亚洲av中文无码乱人伦在线视色,亚洲国产欧美国产综合在线,亚洲国产精品综合久久2007

锘?div class="header_top">
Java鐭ヨ瘑鍒嗕韓緗?- 杞繪澗瀛︿範(fàn)浠庢寮€濮嬶紒聽聽聽聽
SpringBoot+SpringSecurity+Vue+ElementPlus鏉冮檺緋葷粺瀹炴垬璇劇▼ 闇囨捈鍙戝竷        

鏈€鏂癑ava鍏ㄦ爤灝變笟瀹炴垬璇劇▼(鍏嶈垂)

springcloud鍒嗗竷寮忕數(shù)鍟嗙鏉€瀹炴垬璇劇▼

IDEA姘鎬箙嬋€媧?/h2>

66濂梛ava瀹炴垬璇劇▼鏃犲璺鍙?/h2>

閿嬪摜寮€濮嬫敹Java瀛﹀憳鍟︼紒

Python瀛︿範(fàn)璺嚎鍥?/h2>

閿嬪摜寮€濮嬫敹Java瀛﹀憳鍟︼紒

Android寮€鍙戜箣钃濈墮璇﹁В PDF 涓嬭澆


鏃墮棿:2020-06-24 15:10鏉ユ簮:http://www.sh6999.cn 浣滆€?灝忛攱  渚墊潈涓炬姤
Android寮€鍙戜箣钃濈墮璇﹁В PDF 涓嬭澆
澶辨晥閾炬帴澶勭悊
Android寮€鍙戜箣钃濈墮璇﹁В PDF 涓嬭澆

鏈珯鏁寸悊涓嬭澆錛?/strong>
閾炬帴錛?a target="_blank">https://pan.baidu.com/s/1wEG7qiwkqYLnHXAR_lufiA 
鎻愬彇鐮侊細(xì)21zd
 
鐩稿叧鎴浘錛?/strong>
 
涓昏鍐呭錛?/strong>
Android 寮€鍙戜箣钃濈墮璇﹁В 涓€.姒傝堪 
榪欑瘒鏂囩珷鏄垜瀛︿範(fàn) Android 寮€鍙戝畼緗戜互鍙?qiáng)缃戜笂涓€浜涘叾浠栨枃绔犳€葷粨鑰屾潵錛屼富瑕佸氨鏄負(fù)浜嗗ソ
濂界爺絀朵竴涓嬭摑鐗欏紑鍙戯紝鐪嬪畬榪欑瘒鏂囩珷浠ュ悗錛屾垜浠氨鐭ラ亾浜嗘€庢牱浣跨敤钃濈墮 API 瀹屾垚寤虹珛钃濈墮榪?/div>
鎺ョ殑蹇呰鍥涙錛?.鎵撳紑钃濈墮錛?.鏌ユ壘闄勮繎宸查厤瀵規(guī)垨鍙敤鐨勮澶囷紱3.榪炴帴璁懼錛?.璁懼闂存暟鎹?/div>
浜ゆ崲銆傜敱浜庢枃绔犳瘮杈冮暱錛屼負(fù)浜嗘柟渚垮ぇ瀹剁殑瀛︿範(fàn)錛屾墍浠ュ皢鏂囩珷鍒嗕負(fù)涓夌瘒錛岃繖鏄涓€綃囥€?/div>
浜?鍩虹 
1.API
鎵€鏈夌殑钃濈墮 API 閮藉湪 android.bluetooth 鍖呬笅.涓嬮潰鏈変竴浜涚被鍜屾帴鍙g殑鎽樿錛屾垜浠渶瑕?/div>
瀹冧滑鏉ュ緩绔嬭摑鐗欒繛鎺?
BluetoothAdapter
浠h〃鏈湴钃濈墮閫傞厤鍣紙钃濈墮鏃犵嚎錛夈€侭luetoothAdapter 鏄墍鏈夎摑鐗欎氦浜掔殑鍏ュ彛銆備嬌鐢ㄨ繖
涓被錛屼綘鑳藉鍙戠幇鍏朵粬鐨勮摑鐗欒澶囷紝鏌ヨ宸查厤瀵硅澶囩殑鍒楄〃錛屼嬌鐢ㄥ凡鐭ョ殑 MAC 鍦板潃鏉ュ疄渚嬪寲
涓€涓?BluetoothDevice 瀵硅薄錛屽茍涓斿垱寤轟竴涓?BluetoothServerSocket 瀵硅薄鏉ョ洃鍚笌鍏朵粬璁懼
鐨勯€氫俊銆?/div>
BluetoothDevice
浠h〃涓€涓繙紼嬬殑钃濈墮璁懼銆備嬌鐢ㄨ繖涓被閫氳繃 BluetoothSocket 鎴栨煡璇㈣濡傚悕縐般€佸湴鍧€銆?/div>
綾誨拰閰嶅鐘舵€佺瓑璁懼淇℃伅鏉ヨ姹傝窡榪滅▼璁懼鐨勮繛鎺ャ€?/div>
BluetoothSocket
浠h〃钃濈墮 socket 鐨勬帴鍙o紙綾諱技 TCP 鐨?Socket錛夈€傝繖鏄厑璁鎬竴涓簲鐢ㄧ▼搴忚窡鍙︿竴涓摑鐗?/div>
璁懼閫氳繃杈撳叆嫻佸拰杈撳嚭嫻佽繘琛屾暟鎹氦鎹㈢殑榪炴帴鐐廣€?/div>
BluetoothServerSocket
浠h〃涓€涓墦寮€鐨勭洃鍚紶鍏ヨ姹傜殑鏈嶅姟鎺ュ彛錛堢被浼間簬 TCP 鐨?ServerSocket錛夈€備負(fù)浜嗚繛鎺ヤ袱
涓?Android 璁懼錛屼竴涓澶囧繀欏葷敤榪欎釜綾繪墦寮€涓€涓湇鍔℃帴鍙c€傚綋榪滅▼钃濈墮璁懼璇鋒眰璺熸湰璁懼
寤虹珛榪炴帴璇鋒眰鏃訛紝 BluetoothServerSocket 浼?xì)鍦q炴帴琚帴鏀舵椂榪斿洖涓€涓榪炴帴鐨?/div>
BluetoothSocket 瀵硅薄銆?/div>
BluetoothClass
鎻忚堪浜嗚摑鐗欒澶囩殑涓€鑸€х壒寰佸拰鍔熻兘銆傝繖涓被鏄竴涓彧璇葷殑灞炴€ч泦錛岃繖浜涘睘鎬у畾涔変簡璁?/div>
澶囩殑涓昏鍜屾瑕佽澶囩被鍜屾湇鍔°€備絾鏄紝榪欎釜綾誨茍涓嶄繚璇佹弿榪頒簡璁懼鎵€鏀寔鐨勬墍鏈夌殑钃濈墮閰嶇疆
鍜屾湇鍔★紝浣嗘槸榪欑瀵硅澶囩被鍨嬬殑鎻愮ず鏄湁鐩婄殑
BluetoothProfile
浠h〃涓€涓摑鐗欓厤緗殑鎺ュ彛銆傝摑鐗欓厤緗槸鍩轟簬钃濈墮閫氫俊鐨勮澶囬棿鐨勬棤綰挎帴鍙h鑼冦€備竴涓緥
瀛愭槸鍏嶆彁鐨勯厤緗€傛洿澶氱殑閰嶇疆璁ㄨ錛岃鐪嬩笅鏂囩殑鐢ㄩ厤緗潵宸ヤ綔銆?/div>
BluetoothHeadset
鎻愪緵瀵逛嬌鐢ㄨ摑鐗欒€蟲満鐨勭Щ鍔ㄧ數(shù)璇濈殑鏀寔銆傚畠鍚屾椂鍖呭惈浜?Bluetooth Headset 鍜?Hands錕綟ree(v1.5)鐨勯厤緗€?/div>
BluetoothA2dp
瀹氫箟濡備綍鎶婇珮鍝佽川鐨勯煶棰戦€氳繃钃濈墮榪炴帴浠庝竴涓澶囨祦鍚戝彟涓€涓澶囥€?ldquo;A2DP”鏄?/div>
Advanced Audio Distribution Profile 鐨勭緝鍐欍€?/div>
BluetoothHealth
浠h〃涓€涓仴搴蜂繚鍋ヨ澶囬厤緗殑鎺у埗钃濈墮鏈嶅姟鐨勪唬鐞嗐€?/div>
BluetoothHealthCallback
鐢ㄤ簬瀹炵幇 BluetoothHealth 鍥炶皟鐨勬娊璞$被銆備綘蹇呴』緇ф壙榪欎釜綾伙紝騫跺疄鐜板畠鐨勫洖璋冩柟娉曪紝
鏉ユ帴鏀跺簲鐢ㄧ▼搴忕殑娉ㄥ唽鐘舵€佸拰钃濈墮閫氶亾鐘舵€佸彉鍖栫殑鏇存柊銆?/div>
BluetoothHealthAppConfiguration
浠h〃钃濈墮鐩稿叧鐨勭涓夋柟鍋ュ悍淇濆仴搴旂敤紼嬪簭鎵€娉ㄥ唽鐨勪笌榪滅▼钃濈墮鍋ュ悍淇濆仴璁懼榪涜閫氫俊
鐨勯厤緗€?/div>
BluetoothProfile.ServiceListener
BluetoothProfile IPC 瀹㈡埛绔繛鎺ユ垨鏂紑鏈嶅姟鐨勯€氱煡鎺ュ彛錛堝畠鏄繍琛岀壒淇楅厤緗殑鍐呴儴
鏈嶅姟錛夈€?/div>
2.鏉冮檺
涓轟簡鍦ㄤ綘鐨勫簲鐢ㄧ▼搴忎腑浣跨敤钃濈墮鍔熻兘錛岃嚦灝戣澹版槑涓や釜钃濈墮鏉冮檺錛圔LUETOOTH 鍜?/div>
BLUETOOTH_ADMIN錛変腑鐨勪竴涓€?/div>
涓轟簡鎵ц浠諱綍钃濈墮閫氫俊錛堝璇鋒眰榪炴帴銆佹帴鏀惰繛鎺ュ拰浼犺緭鏁版嵁錛夛紝浣犲繀欏葷敵璇?BLUETOOTH
鏉冮檺銆?/div>
涓轟簡鍚姩璁懼鍙戠幇鎴栫淮鎶よ摑鐗欒緗紝浣犲繀欏葷敵璇?BLUETOOTH_ADMIN 鏉冮檺銆傚ぇ澶氭暟闇€瑕佽繖
涓潈闄愮殑搴旂敤紼嬪簭錛屼粎浠呮槸涓鴻兘澶熷彂鐜版湰鍦扮殑钃濈墮璁懼銆傝繖涓潈闄愭墍鎺堜簣鐨勫叾浠栬兘鍔涘簲璇ヤ笉
琚嬌鐢紝闄ら潪鏄數(shù)婧愮鐞嗙殑搴旂敤紼嬪簭錛屽畠浼?xì)鍦ㄤ緷鎹敤鎴风殑璇锋眰鏉ヤ慨鏀硅摑鐗欒畡〗€傛敞鎰忥細(xì)濡傛灉
浣犱嬌鐢ㄤ簡 BLUETOOTH_ADMIN 鏉冮檺錛岄偅涔堝繀欏昏鏈?BLUETOOTH 鏉冮檺銆?/div>
鍦ㄦ竻鍗曟枃浠朵腑澹版槑濡備笅鏉冮檺錛?/div>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
3.璁劇疆钃濈墮
鍦ㄥ簲鐢ㄧ▼搴忚兘澶熷埄鐢ㄨ摑鐗欓€氶亾閫氫俊涔嬪墠錛岄渶瑕佺‘璁よ澶囨槸鍚︽敮鎸佽摑鐗欓€氫俊錛屽鏋滄敮鎸侊紝
瑕佺‘淇濆畠鏄彲鐢ㄧ殑銆?/div>
濡傛灉涓嶆敮鎸佽摑鐗欙紝閭d箞浣犲簲璇ユ湁濂界殑紱佺敤鎵€鏈夎摑鐗欏姛鑳姐€傚鏋滄敮鎸佽摑鐗欙紝浣嗘槸琚鐢ㄧ殑錛?/div>
閭d箞浣犺鍦ㄤ笉紱誨紑浣犵殑搴旂敤紼嬪簭鐨勬儏鍐典笅錛岃姹傜敤鎴峰惎鐢ㄨ摑鐗欏姛鑳斤紝榪欑璁劇疆瑕佷嬌鐢?/div>
BluetoothAdapter 瀵硅薄錛屽湪浠ヤ笅涓や釜姝ラ涓畬鎴愩€?/div>
(1)鑾峰緱 BluetoothAdapter 瀵硅薄
BluetoothAdapter 瀵硅薄鏄墍鏈夎摑鐗欐椿鍔ㄩ兘闇€瑕佺殑錛岃鑾峰緱榪欎釜瀵硅薄錛屽氨瑕佽皟鐢ㄩ潤鎬佺殑
getDefaultAdapter() 鏂?娉?銆?榪?涓?鏂?娉?浼?榪?鍥?涓€ 涓?浠?琛?璁?澶?鑷?宸?鐨?钃?鐗?閫?閰?鍣?鐨?/div>
BluetoothAdapter 瀵硅薄銆傛暣涓郴緇熸湁涓€涓摑鐗欓€傞厤鍣紝浣犵殑搴旂敤紼嬪簭鑳藉浣跨敤榪欎釜瀵硅薄鏉?/div>
榪涜浜や簰銆傚鏋?getDefaultAdapter()鏂規(guī)硶榪斿洖 null錛岄偅涔堣璁懼涓嶆敮鎸佽摑鐗欙紝浣犵殑澶勭悊涔?/div>
瑕佸湪姝ょ粨鏉熴€備緥濡傦細(xì)
BluetoothAdapter mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter ==null){
// 璁懼涓嶆敮鎸佽摑鐗?/div>
}
(2)鍚敤钃濈墮鍔熻兘
鎺ヤ笅鏉ワ紝浣犻渶瑕佺‘淇濊摑鐗欐槸鍙敤鐨勩€傝皟鐢?isEnabled()鏂規(guī)硶鏉ユ鏌ュ綋鍓嶈摑鐗欐槸鍚﹀彲鐢ㄣ€?/div>
濡傛灉榪欎釜鏂規(guī)硶榪斿洖 false錛岄偅涔堣摑鐗欐槸琚鐢ㄧ殑銆傝鐢寵鍚敤钃濈墮鍔熻兘錛屽氨瑕佽皟鐢ㄥ甫鏈?/div>
ACTION_REQUEST_ENABLE 鎿嶄綔鎰忓浘鐨?startActivityForResult()鏂規(guī)硶銆傚畠浼?xì)缁櫨p葷粺璁劇疆鍙戜竴
涓惎鐢ㄨ摑鐗欏姛鑳界殑璇鋒眰錛堜笉緇堟浣犵殑搴旂敤紼嬪簭錛夈€備緥濡傦細(xì)
if(!mAdapter.isEnabled()) {
 Intent intent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE );
 activity.startActivityForResult(intent, requestCode);
}
榪欐椂浼?xì)鏄窘C轟竴涓姹傜敤鎴峰惎鐢ㄨ摑鐗欏姛鑳界殑瀵硅瘽妗?/div>
濡傛灉鐢ㄦ埛鐐瑰嚮鍏佽錛岄偅涔堢郴緇熶細(xì)寮€濮嬪惎鐢ㄨ摑鐗欏姛鑳斤紝瀹屾垚鍚姩榪囩▼錛堟湁鍙兘澶辮觸錛夛紝鐒?/div>
鐐逛細(xì)榪斿洖緇欎綘鐨勫簲鐢ㄧ▼搴忋€備紶閫掔粰 startActivityForResult()鏂規(guī)硶鐨?requestCode 鏄竴涓?/div>
浣犵殑搴旂敤紼嬪簭涓畾涔夌殑鏁存暟錛堝畠蹇呴』澶т簬 0錛夛紝緋葷粺浼?xì)鎶婂畠浣滀负鍙傛暟杩斿洖鍒颁綘鐨?/div>
onActivityResult()鍥炶皟瀹炵幇涓€?/div>
濡傛灉钃濈墮鍔熻兘鍚敤鎴愬姛錛屼綘鐨?Activity 浼?xì)鍦?onActivityResult()鍥炶皟涓帴鏀跺埌
RESULT_OK 緇撴灉錛屽鏋滆摑鐗欐病鏈夎鍚姩錛堟垨鑰呯敤鎴峰搷搴斾簡鎷掔粷錛夛紝閭d箞璇ョ粨鏋滅紪鐮佹槸
RESULT_CANCELED銆?/div>
鍙€夊湴錛屼綘鐨勫簲鐢ㄧ▼搴忚繕鍙互鐩戝惉 ACTION_STATE_CHANGED 騫挎挱 Intent錛屾棤璁鴻摑鐗欑姸鎬?/div>
浣曟椂鏀瑰彉錛岀郴緇熼兘浼?xì)骞挎挱杩欎?Intent銆傝繖涓箍鎾寘鍚殑闄勫姞瀛楁 EXTRA_STATE 鍜?/div>
EXTRA_PREVIOUS_STATE 涓垎鍒寚鏄庝簡鏂扮殑鍜屾棫鐨勮摑鐗欑姸鎬併€傝繖浜涢檮鍔犲瓧孌典腑鍙兘鐨勫€兼槸錛?/div>
STATE_TURNING_ON銆丼TATE_ON銆丼TATE_TURNING_OFF 鍜?STATE_OFF銆傜洃鍚繖涓箍鎾浜庡湪搴?/div>
鐢ㄧ▼搴忚繍琛屾椂媯€嫻嬭摑鐗欑殑鐘舵€佹槸鏈夌敤鐨勩€?/div>
鎻愮ず錛氬惎鐢ㄥ彲鍙戠幇鑳藉姏浼?xì)鑷姩鍚姩钃濈墮鍔熻兘銆傚鏋滀綘璁″垝鍦ㄦ墽琛岃摑鐗欐椿鍔ㄤ箣鍓嶏紝瑕佸緇?/div>
鍚敤璁懼鐨勫彲鍙戠幇鏈哄埗錛屽氨鍙互璺寵繃涓婇潰鐨勬楠わ紝璇︾粏璇峰弬鑰冧笅鏂?ldquo;鍚敤钃濈墮鍙彂鐜?rdquo;銆?/div>
鍒版錛屾垜浠厛緇欏嚭涓€涓緥瀛愶紝璁╁ぇ瀹剁悊瑙d竴涓嬶細(xì)
鎴戜滑璁劇疆浜嗗洓涓寜閽紝鍒嗗埆鐢ㄤ簬鍒ゆ柇鏄惁鏀寔钃濈墮錛岃摑鐗欐槸鍚﹀紑鍚紝寮€鍚摑鐗欙紝鍏抽棴钃?/div>
鐗欙紝鐢變簬浣跨敤鐨勬槸妯℃嫙鍣紝鎵€浠ユ垜浠彲浠ョ湅鍒板疄楠岀粨鏋滄槸褰撳墠璁懼涓嶆敮鎸佽摑鐗欙紝騫朵笖钃濈墮鏈?/div>
寮€鍚紝鐐瑰嚮鍚庨潰涓や釜鎸夐挳娌″弽搴旓紝濡傛灉鏄湪鐪熸槸璁懼涓婏紝鎴戜滑鍙互榪涜寮€鍚摑鐗欏拰鍏抽棴钃濈墮
鐨勬搷浣滐紝澶у涓嬫潵鍙互璇曚竴璇曪紝涓嬮潰緇欏嚭浠g爜錛?/div>
/**
* Created by lxn on 2016/3/4.
* 钃濈墮綆$悊綾?/div>
*/
public class BluetoothController {
 private BluetoothAdapter mAdapter;
 public BluetoothController(){
 mAdapter = BluetoothAdapter.getDefaultAdapter();
 }
 /**
 * 鍒ゆ柇褰撳墠璁懼鏄惁鏀寔钃濈墮
 * @return
 */
 public boolean isSupportBluetooth(){
 if(mAdapter!=null){
 return true;
 }
 return false;
 }
 /**
 * 鑾峰彇钃濈墮鐨勭姸鎬?/div>
 * @return
 */
 public boolean getBluetoothStatus(){
 if(mAdapter!=null){
 return mAdapter.isEnabled();
 }
 return false;
 }
 /**
 * 鎵撳紑钃濈墮
 * @param activity
 * @param requestCode
 */
 public void turnOnBluetooth(Activity activity,int requestCode){
 if(mAdapter!=null&&!mAdapter.isEnabled()) {
 Intent intent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE);
 activity.startActivityForResult(intent, requestCode);
 }
 }
 /**
 * 鍏抽棴钃濈墮
 */
 public void turnOffBluetooth(){
 if(mAdapter!=null&&mAdapter.isEnabled()) {
 mAdapter.disable();
 }
 } }
public class MainActivity extends AppCompatActivity {
 public static final int REQUESTCODE_OPEN = 1;
 private BluetoothController mController = new BluetoothController();
 private BroadcastReceiver receiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
 int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 1);
 switch (state) {
 case BluetoothAdapter.STATE_OFF:
 Toast.makeText(MainActivity.this, " 钃?鐗?宸?鍏?闂?", 
Toast.LENGTH_SHORT).show();
 break;
 case BluetoothAdapter.STATE_ON:
 Toast.makeText(MainActivity.this, " 钃濈墮宸叉墦寮€ ", 
Toast.LENGTH_SHORT).show();
 break;
 case BluetoothAdapter.STATE_TURNING_ON:
 Toast.makeText(MainActivity.this, " 姝?鍦?鎵?寮€ 钃?鐗?", 
Toast.LENGTH_SHORT).show();
 break;
 case BluetoothAdapter.STATE_TURNING_OFF:
 Toast.makeText(MainActivity.this, " 姝?鍦?鍏?闂?钃?鐗?", 
Toast.LENGTH_SHORT).show();
 break;
 default:
 Toast.makeText(MainActivity.this, " 鏈煡鐘舵€?", 
Toast.LENGTH_SHORT).show();
 }
 }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 IntentFilter filter = new 
IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
 registerReceiver(receiver, filter);
 }
 public void click(View view) {
 switch (view.getId()) {
 case R.id.btnIsSupport:
 boolean flag = mController.isSupportBluetooth();
 Toast.makeText(this, "flag = " + flag, 
Toast.LENGTH_SHORT).show();
 break;
 case R.id.btnIsTurnOn:
 boolean isTurnOn = mController.getBluetoothStatus();
 Toast.makeText(this, "isTurnOn" + isTurnOn, 
Toast.LENGTH_SHORT).show();
 break;
 case R.id.btnTurnOn:
 mController.turnOnBluetooth(this, REQUESTCODE_OPEN);
 break;
 case R.id.btnTrunOff:
 mController.turnOffBluetooth();
 break;
 }
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
 super.onActivityResult(requestCode, resultCode, data);
 if(resultCode==RESULT_OK){
 Toast.makeText(this, "緇堜簬鎵撳紑浜?quot;, Toast.LENGTH_SHORT).show();
 }
 } }
4.鏌ユ壘璁懼
浣跨敤 BluetoothAdapter 瀵硅薄錛岃兘澶熼€氳繃璁懼鍙戠幇鎴栨煡璇㈠凡閰嶅鐨勮澶囧垪琛ㄦ潵鎵懼埌榪滅▼
鐨勮摑鐗欒澶囥€?/div>
璁懼鍙戠幇鏄竴涓壂鎻忚繃紼嬶紝璇ヨ繃紼嬫悳绱㈡湰鍦板尯鍩熷唴鍙敤鐨勮摑鐗欒澶囷紝鐒跺悗璇鋒眰涓€浜涘郊姝?/div>
鐩稿叧鐨勪竴浜涗俊鎭紙榪欎釜榪囩▼琚彨鍋?ldquo;鍙戠幇”銆?ldquo;鏌ヨ”鎴?ldquo;鎵弿”錛夈€備絾鏄紝鏈湴鍖哄煙鍐呯殑钃濈墮
璁懼鍙湁鍦ㄥ畠浠篃鍚敤浜嗗彲鍙戠幇鍔熻兘鏃訛紝鎵嶄細(xì)鍝嶅簲鍙戠幇璇鋒眰銆傚鏋滀竴涓澶囨槸鍙彂鐜扮殑錛岄偅
涔堝畠浼?xì)閫氳繃鍏變韓鏌愪簺淇℃伅錛堝璁懼鍚嶇О銆佺被鍒拰鍞竴鐨?MAC 鍦板潃錛夋潵鍝嶅簲鍙戠幇璇鋒眰銆備嬌鐢ㄨ繖
浜涗俊鎭紝鎵ц鍙戠幇澶勭悊鐨勮澶囪兘澶熸湁閫夋嫨鐨勫垵濮嬪寲璺熻鍙戠幇璁懼鐨勮繛鎺ャ€?/div>
涓€鏃﹁窡榪滅▼鐨勮澶囧緩绔嬬殑棣栨榪炴帴錛岄厤瀵硅姹傚氨浼?xì)鑷姩鐨勮灞曠幇缁欑敤鎴枫€傚綋璁懼瀹屾垚閰?/div>
瀵癸紝鐩稿叧璁懼鐨勫熀鏈俊鎭紙濡傝澶囧悕縐般€佺被鍒拰 MAC 鍦板潃錛夊氨浼?xì)琚繚瀛樺Q屽茍鑳藉浣跨敤钃濈墮 API
鏉ヨ鍙栥€備嬌鐢ㄥ凡鐭ョ殑榪滅▼璁懼鐨?MAC 鍦板潃錛屽湪浠諱綍鏃跺€欓兘鑳藉鍒濆鍖栦竴涓繛鎺ワ紝鑰屼笉闇€瑕佹墽
琛屽彂鐜板鐞嗭紙鍋囪璁懼鍦ㄥ彲榪炴帴鐨勮寖鍥村唴錛夈€?/div>
瑕佽浣忛厤瀵瑰拰榪炴帴涔嬮棿鐨勫樊寮傘€傞厤瀵規(guī)剰鍛崇潃涓や釜璁懼瀵瑰郊姝ゅ瓨鍦ㄦ€х殑鎰熺煡錛屽畠浠箣闂存湁
涓€涓叡浜殑鐢ㄤ簬楠岃瘉鐨勮繛鎺ュ瘑閽ワ紝鐢ㄨ繖涓瘑閽ヤ袱涓澶囦箣闂村緩绔嬭鍔犲瘑鐨勮繛鎺ャ€傝繛鎺ユ剰鍛崇潃
褰撳墠璁懼闂村叡浜竴涓?RFCOMM 閫氶亾錛屽茍涓旇兘澶熻鐢ㄤ簬璁懼闂寸殑鏁版嵁浼犺緭銆傚綋鍓?Android 钃濈墮
API 鍦?RFCOMM 榪炴帴琚緩绔嬩箣鍓嶏紝瑕佹眰璁懼涔嬮棿閰嶅銆傦紙鍦ㄤ嬌鐢ㄨ摑鐗?API 鍒濆鍖栧姞瀵嗚繛鎺ユ椂錛?/div>
閰嶅鏄嚜鍔ㄨ鎵ц鐨勩€傦級
浠ヤ笅绔犺妭浠嬬粛濡備綍鍙戠幇宸查厤瀵圭殑璁懼錛屾垨鍙戠幇鏂扮殑浣跨敤浜嗗彲鍙戠幇鍔熻兘鐨勮澶囥€?/div>
娉ㄦ剰錛氶粯璁?Android 璁懼鏄笉鍙彂鐜扮殑銆傜敤鎴瘋兘澶熼€氳繃緋葷粺璁劇疆鍦ㄩ檺瀹氱殑鏃墮棿鍐呭彉鎴愬彲
鍙戠幇鐨勮澶囷紝鎴栬€呭簲鐢ㄧ▼搴忚兘澶熻姹傜敤鎴峰惎鐢ㄥ彲鍙戠幇鎬э紝鑰屼笉紱誨紑搴旂敤紼嬪簭銆傚浣曞惎鐢ㄥ彲鍙?/div>
鐜版€э紝浼?xì)鍦ㄤ笅鏂囨潵璁ㄨ銆?/div>
鏌ヨ閰嶅璁懼
鍦ㄦ墽琛岃澶囧彂鐜頒箣鍓嶏紝搴旇鍏堟煡璇㈠凡閰嶅鐨勮澶囬泦鍚堬紝鏉ョ湅鏈熸湜鐨勮澶囨槸鍚︽槸宸茬煡鐨勩€?/div>
璋冪敤 getBondedDevices()鏂規(guī)硶鏉ュ畬鎴愯繖浠跺伐浣溿€傝繖涓柟娉曚細(xì)榪斿洖涓€涓唬琛ㄥ凡閰嶅璁懼鐨?/div>
BluetoothDevice 瀵硅薄鐨勯泦鍚堛€備緥濡傦紝浣犺兘澶熸煡璇㈡墍鏈夌殑閰嶅璁懼錛岀劧鍚庝嬌鐢ㄤ竴涓?/div>
ArrayAdapter 瀵硅薄鎶婃瘡涓凡閰嶅璁懼鐨勫悕縐版樉紺虹粰鐢ㄦ埛銆?/div>
 /**
 * 鑾峰彇宸茬粡閰嶅鐨勮澶?/div>
 */
 public Set<BluetoothDevice> getConnetedDevices() {
 if (mAdapter != null && mAdapter.isEnabled()) {
 return mAdapter.getBondedDevices();
 }
 return null;
 }
Set<BluetoothDevice> connetedDevices = mController.getConnetedDevices();
 for(BluetoothDevice device:connetedDevices){
 adapter.add(device.getName()+"\n"+ device.getAddress());
 listView.setAdapter(adapter);
 } 浠?BluetoothDevice 瀵硅薄鏉ュ垵濮嬪寲涓€涓繛鎺ユ墍闇€瑕佺殑鎵€鏈変俊鎭氨鏄?MAC 鍦板潃銆傚湪榪欎釜
渚嬪瓙涓紝MAC 鍦板潃琚綔涓?ArrayAdapter 鐨勪竴閮ㄥ垎鏉ヤ繚瀛橈紝騫舵樉紺虹粰鐢ㄦ埛銆傞殢鍚庯紝璇?MAC 鍦?/div>
鍧€鑳藉琚彁鍙栫敤浜庡垵濮嬪寲榪炴帴銆?/div>
鍙戠幇璁懼
綆€鍗曠殑璋冪敤 startDiscovery()鏂規(guī)硶灝卞彲浠ュ紑濮嬪彂鐜拌澶囥€傝榪囩▼鏄紓姝ョ殑錛屽茍涓旇鏂?/div>
娉曚細(xì)绔嬪嵆榪斿洖涓€涓竷?yōu)當(dāng)鍊兼潵鎸囨槑鍙戠幇澶勭悊鏄惁琚垚鍔熺殑鍚姩銆傞€氬父鍙戠幇榪囩▼浼?xì)鏌ヨ鎵弿澶ЬU?/div>
12 縐掞紝鎺ヤ笅鏉ヨ幏鍙栨壂鎻忓彂鐜扮殑姣忎釜璁懼鐨勮摑鐗欏悕縐般€?/div>
涓轟簡鎺ユ敹姣忎釜琚彂鐜拌澶囩殑鐨勪俊鎭紝浣犵殑搴旂敤紼嬪簭蹇呴』娉ㄥ唽涓€涓?ACTION_FOUND 綾誨瀷鐨?/div>
騫挎挱鎺ユ敹鍣ㄣ€傚搴旀瘡涓摑鐗欒澶囷紝緋葷粺閮戒細(xì)騫挎挱 ACTION_FOUND 綾誨瀷鐨?Intent銆傝繖涓?Intent
浼?xì)鎼哄?EXTRA_DEVICE 鍜?EXTRA_CLASS 闄勫姞瀛楁錛岃繖涓袱涓瓧孌靛垎鍒寘鍚簡 BluetoothDevice
鍜?BluetoothClass 瀵硅薄銆備緥濡傦紝涓嬪垪婕旂ず浜嗕綘濡備綍娉ㄥ唽鍜屽鐞嗚澶囧彂鐜版椂鐨勫箍鎾細(xì)
//絎竴姝ワ細(xì)娉ㄥ唽騫挎挱
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
 registerReceiver(mReceiver, filter);//涓嶈蹇樹簡鍦?onDestory 涓?unregister
 絎簩閮細(xì)寮€濮嬪彂鐜?/div>
mController.startDiscovery();//寮€濮嬫悳绱㈠彲鍙戠幇鐨勮澶?/div>
//絎笁姝?鎺ユ敹騫挎挱
 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
 String action = intent.getAction();
 //鍙戠幇浜嗚澶?/div>
 if(BluetoothDevice.ACTION_FOUND.equals(action)){
 Toast.makeText(MainActivity.this, " 鍙戠幇璁懼 ", 
Toast.LENGTH_SHORT).show();
 //浠?Intent 涓幏鍙栬澶囩殑 BluetoothDevice 瀵硅薄
 BluetoothDevice device = 
intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE);
 adapter.add(device.getName()+"\n"+ device.getAddress());
 listView.setAdapter(adapter);
 }
 }
 };
緇撴灉濡備笅錛?/div>
鍙互鐪嬪埌錛屾垜浠凡緇忔妸鍙戠幇鐨勮澶囧睍紺哄埌浜?ListView 涓€?/div>
璀﹀憡錛氭墽琛岃澶囧彂鐜幫紝瀵逛簬钃濈墮閫傞厤鍣ㄦ潵璇存槸涓€涓矇閲嶇殑榪囩▼錛屽畠浼?xì)娑堣€楀ぇ閲忕殑璧勬簮銆?/div>
涓€鏃﹀彂鐜拌榪炴帴璁懼錛屽湪灝濊瘯榪炴帴涔嬪墠涓€瀹氳紜鐢?cancelDiscovery()鏂規(guī)硶鏉ョ粓姝㈠彂鐜版搷
浣溿€傚彟澶栵紝濡傛灉宸茬粡鏈変竴涓窡璁懼鐨勮繛鎺ワ紝閭d箞鎵ц鍙戠幇浼?xì)鏄庢槃勫噺灏憳q炴帴鐨勫彲鐢ㄥ甫瀹斤紝鍥?/div>
姝ゅ湪鏈夎繛鎺ョ殑鏃跺€欎笉搴旇鎵ц鍙戠幇澶勭悊銆?/div>
Android 寮€鍙戜箣钃濈墮璇﹁В(浜? 涓€.姒傝堪 
鍦ㄧ涓€綃?Android 寮€鍙戜箣钃濈墮璇﹁В(涓€)涓垜涓昏浠嬬粛浜嗕竴浜涚悊璁烘€х殑鐭ヨ瘑浠ュ強(qiáng)姣旇緝鍩?/div>
紜€鐨勬搷浣滐紝姣斿鎺у埗钃濈墮鐨勭姸鎬侊紝鏌ユ壘璁懼錛屾樉紺哄綋鍓嶅凡榪炴帴鐨勮澶囷紝浠婂ぉ鎴戜滑鐪嬬湅鍏朵粬鐨?/div>
涓€浜涙搷浣溿€?/div>
浜?鍩虹 
1.鍙彂鐜版ā寮?/div>
鍦ㄤ笂涓€綃囨渶鍚庯紝鎴戜滑浠嬬粛浜嗗浣曞彂鐜拌澶囷紝浣嗘槸鏈変簺鏃跺€欙紝鎴戜滑褰撳墠璁懼鏄笉鍙鍙戠幇
鐨勶紝涔熷氨鏄鍗充嬌鎴戜滑鎵撳紑浜嗚摑鐗欏叾浠栬澶囦篃鏄棤娉曟悳绱㈠埌鐨勩€傛墍浠ユ垜浠瀛﹀濡備綍鍚敤璁?/div>
澶囩殑鍙彂鐜版€с€傚鏋滆璁╂湰鍦拌澶囧彲浠ヨ鍏朵粬璁懼鍙戠幇錛岄偅涔堝氨瑕佽皟鐢?/div>
ACTION_REQUEST_DISCOVERABLE 鎿嶄綔鎰忓浘鐨?startActivityForResult(Intent, int)鏂規(guī)硶銆?/div>
榪欎釜鏂規(guī)硶浼?xì)鍚懢p葷粺璁劇疆鍙戝嚭涓€涓惎鐢ㄥ彲鍙戠幇妯″紡鐨勮姹傦紙涓嶇粓姝㈠簲鐢ㄧ▼搴忥級銆傞粯璁ゆ儏鍐典笅錛?/div>
璁懼鐨勫彲鍙戠幇妯″紡浼?xì)鎸伨l?120 縐掋€傞€氳繃緇?Intent 瀵硅薄娣誨姞 EXTRA_DISCOVERABLE_DURATION
闄勫姞瀛楁錛屽彲浠ュ畾涔変笉鍚屾寔緇椂闂淬€傚簲鐢ㄧ▼搴忚兘澶熻緗殑鏈€澶ф寔緇椂闂存槸 3600 縐掞紝0 鎰忓懗
鐫€璁懼濮嬬粓鏄彲鍙戠幇鐨勩€備換浣曞皬浜?0 鎴栧ぇ浜?3600 縐掔殑鍊奸兘浼?xì)鑷姩鐨勮璁句?120 縐掋€備緥濡傦紝
浠ヤ笅浠g爜鎶婃寔緇椂闂磋緗負(fù) 300 縐掞細(xì)
 Intent discoverableIntent = new
 Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
 //瀹氫箟鎸佺畫鏃墮棿
 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 
300);
 startActivity(discoverableIntent);
鏁堟灉鍥撅細(xì)
濡傚浘鎵€紺猴紝鐢寵鐢ㄦ埛鍚敤璁懼鐨勫彲鍙戠幇妯″紡鏃訛紝浼?xì)鏄窘C鴻繖鏍蜂竴涓璇濇銆傚鏋滃搷搴?ldquo;涓?/div>
鍠滄€?rdquo;錛岄偅涔堣澶囩殑鍙彂鐜版ā寮忎細(xì)鎸佺畫鎸囧畾鐨勬椂闂達(dá)紝鑰屼笖浣犵殑 Activity 浼?xì)鎺ユ敹甯︽湁缁撴灉浠g?/div>
絳変簬鍙彂鐜拌澶囨寔緇椂闂寸殑 onActivityResult()鍥炶皟鏂規(guī)硶鐨勮皟鐢ㄣ€傚鏋滅敤鎴峰搷搴?ldquo;鎷掔粷”
鎴栨湁閿欒鍙戠敓錛屽垯緇撴灉浠g爜絳変簬 RESULT_CANCELED.
娉ㄦ剰錛氬鏋滆澶囨病鏈夊紑鍚摑鐗欏姛鑳斤紝閭d箞寮€鍚澶囩殑鍙彂鐜版ā寮忎細(xì)鑷姩寮€鍚摑鐗欍€?/div>
鍦ㄥ彲鍙戠幇妯″紡涓嬶紝璁懼浼?xì)闈欓潤鐨勬妸杩櫩U嶆ā寮忎繚鎸佸埌鎸囧畾鐨勬椂闀褲€傚鏋滀綘鎯寵鍦ㄥ彲鍙戠幇妯?/div>
寮忚鏀瑰彉鏃惰幏寰楅€氱煡錛岄偅涔堜綘鍙互娉ㄥ唽涓€涓?ACTION_SCAN_MODE_CHANGED 綾誨瀷鐨?Intent 騫?/div>
鎾€傝繖涓?Intent 瀵硅薄涓寘鍚簡 EXTRA_SCAN_MODE 鍜?EXTRA_PREVIOUS_SCAN_MODE 闄勫姞瀛楁錛?/div>
瀹?浠?浼?鍒?鍒?鍛?璇?浣?鏂?鏃?鎵?鎻?妯?寮?銆?瀹?浠?姣?涓?鍙?鑳?鐨?鍊?鏄?錛?/div>
SCAN_MODE_CONNECTABLE_DISCOVERABLE錛孲CAN_MODE_CONNECTABLE 鎴?SCAN_MODE_NONE錛屽畠浠?/div>
鍒嗗埆鎸囨槑璁懼鏄湪鍙彂鐜版ā寮忎笅錛岃繕鏄笉鍦ㄥ彲鍙戠幇妯″紡涓嬩絾渚濈劧鍙帴鏀惰繛鎺ワ紝鎴栬€呮槸涓嶅湪鍙?/div>
鍙戠幇妯″紡涓嬶紝涓嶈兘鎺ユ敹榪炴帴銆?/div>
涓嬮潰鏄ず渚嬩唬鐮侊細(xì)
public class MainActivity extends Activity {
 public static final int TURN = 1;
 private BluetoothController mController = new BluetoothController();
 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
 int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,1);
 switch (mode){
 case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
 Toast.makeText(MainActivity.this, " 鐜?鍦?鏄?鍙?鍙?鐜?妯?寮?", 
Toast.LENGTH_SHORT).show();
 break;
 case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
 Toast.makeText(MainActivity.this, "鐜板湪涓嶆槸鍙彂鐜版ā寮忥紝浣嗘槸
鍙互榪炴帴", Toast.LENGTH_SHORT).show();
 }
 }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 //娉ㄥ唽騫挎挱錛岀洃鍚ā寮忔敼鍙?/div>
 IntentFilter filter = new 
IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
 registerReceiver(mReceiver,filter);
 }
 public void click(View view){
 switch (view.getId()){
 case R.id.turnOn:
 mController.turnOnBluetooth(this, TURN);
 break;
 case R.id.canFind:
 Intent discoverableIntent = new
 Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
 //瀹氫箟鎸佺畫鏃墮棿
 
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 10);
 startActivity(discoverableIntent);
 break;
 }
 } }
濡傛灉浣犺鍒濆鍖栬窡榪滅▼璁懼鐨勮繛鎺ワ紝浣犱笉闇€瑕佸惎鐢ㄨ澶囩殑鍙幇鎬с€傚彧鏈夊湪浣犳兂瑕佹妸浣犵殑
搴旂敤紼嬪簭浣滀負(fù)鏈嶅姟绔潵鎺ユ敹杈撳叆榪炴帴鏃訛紝鎵嶉渶瑕佸惎鐢ㄥ彲鍙戠幇鎬э紝鍥犱負(fù)榪滅▼璁懼鍦ㄨ窡浣犵殑璁懼
榪炴帴涔嬪墠蹇呴』鑳藉鍙戠幇瀹冦€?/div>
2.榪炴帴璁懼
涓轟簡璁╀袱涓澶囦笂鐨勪袱涓簲鐢ㄧ▼搴忎箣闂村緩绔嬭繛鎺ワ紝浣犲繀欏誨悓鏃跺疄鐜版湇鍔$鍜屽鎴風(fēng)鏈哄埗錛?/div>
鍥犱負(fù)涓€涓澶囧繀欏繪墦寮€鏈嶅姟绔彛錛屽悓鏃跺彟涓€涓澶囧繀欏誨垵濮嬪寲璺熸湇鍔$璁懼鐨勮繛鎺ワ紙浣跨敤鏈?/div>
鍔$鐨?MAC 鍦板潃鏉ュ垵濮嬪寲涓€涓繛鎺ワ級銆傚綋鏈嶅姟绔拰瀹㈡埛绔湪鐩稿悓鐨?RFCOMM 閫氶亾涓婃湁涓€涓?/div>
BluetoothSocket 榪炴帴鏃訛紝鎵嶈兘澶熻璁や負(fù)鏄湇鍔$鍜屽鎴風(fēng)涔嬮棿寤虹珛浜嗚繛鎺ャ€傝繖鏃訛紝姣忎釜璁?/div>
澶囪兘澶熻幏寰楄緭鍏ュ拰杈撳嚭嫻侊紝騫朵笖鑳藉褰兼寮€濮嬩紶杈撴暟鎹€?/div>
鏈嶅姟绔澶囧拰瀹㈡埛绔澶囧郊姝よ幏鍙栨墍闇€鐨?BluetoothSocket 鐨勬柟娉曟槸涓嶅悓鐨勩€傛湇鍔$浼?/div>
鍦ㄦ帴鏀惰緭鍏ヨ繛鎺ョ殑鏃跺€欐帴鏀跺埌涓€涓?BluetoothSocket 瀵硅薄銆傚鎴風(fēng)浼?xì)鍦ㄦ墦寮€璺熸湇鍔$鐨?/div>
RFCOMM 閫氶亾鏃舵帴鏀跺埌涓€涓?BluetoothSocket 瀵硅薄銆?/div>
涓€縐嶅疄鐜版妧鏈槸鑷姩鐨勫噯澶囦竴涓澶囦綔涓烘湇鍔$錛屼互渚垮湪姣忎釜璁懼閮戒細(xì)鏈変竴涓湇鍔″鎺?/div>
瀛楄鎵撳紑錛屽茍鐩戝惉榪炴帴璇鋒眰銆傚綋鍙︿竴涓澶囧垵濮嬪寲涓€涓窡鏈嶅姟绔鎺ュ瓧鐨勮繛鎺ユ椂錛屽畠?yōu)兗?xì)鍙?/div>
鎴愪竴涓鎴風(fēng)銆傚彟涓€縐嶆柟娉曪紝涓€涓澶囨槸鏄庣‘鐨?rdquo;host”榪炴帴錛屽茍涓旀牴鎹姹傛墦寮€涓€涓湇鍔?/div>
濂楁帴瀛楋紝鑰屽叾浠栫殑璁懼鍙槸綆€鍗曠殑鍒濆鍖栬繛鎺ャ€?/div>
娉ㄦ剰錛氬鏋滀袱涓澶囦箣鍓嶆病鏈夐厤瀵癸紝閭d箞 Android 妗嗘灦浼?xì)鍦q炴帴榪囩▼鏈熼棿錛岃嚜鍔ㄧ殑鏄劇ず
涓€涓厤瀵硅姹傞€氱煡鎴栧璇濇緇欑敤鎴鳳紝濡傚浘 3 鎵€紺恒€傚洜姝ゅ湪璇曞浘榪炴帴璁懼鏃訛紝浣犵殑搴旂敤紼嬪簭涓?/div>
闇€瑕佸叧蹇冭澶囨槸鍚﹁閰嶅銆侳RCOMM 鐨勫皾璇曟€ц繛鎺ヤ細(xì)涓€鐩撮樆濉烇紝涓€鐩村埌鐢ㄦ埛鎴愬姛鐨勯厤瀵癸紝鎴?/div>
鑰呮槸鍥犵敤鎴鋒嫆緇濋厤瀵規(guī)垨閰嶅瓚呮椂鑰屽け璐ャ€?/div>
褰撲綘鎯寵榪炴帴涓や釜璁懼鏃訛紝涓€涓繀欏婚€氳繃鎸佹湁涓€涓墦寮€鐨?BluetoothServerSocket 瀵硅薄
鏉ヤ綔涓烘湇鍔$銆傛湇鍔″鎺ュ瓧鐨勭敤閫旀槸鐩戝惉杈撳叆鐨勮繛鎺ヨ姹傦紝騫朵笖鍦ㄤ竴涓繛鎺ヨ姹傝鎺ユ敹鏃訛紝
鎻愪緵涓€涓?BluetoothSocket 榪?鎺?瀵?璞?銆?鍦?浠?BluetoothServerSocket 瀵硅薄涓幏鍙?/div>
BluetoothSocket 鏃訛紝BluetoothServerSocket 鑳藉錛堝茍涓斾篃搴旇錛夎搴熷純錛岄櫎闈炰綘鎯寵鎺?/div>
鏀舵洿澶氱殑榪炴帴銆?/div>
浠ヤ笅鏄緩绔嬫湇鍔″鎺ュ瓧鍜屾帴鏀朵竴涓繛鎺ョ殑鍩烘湰榪囩▼銆?/div>
1. 璋?鐢?listenUsingRfcommWithServiceRecord(String, UUID) 鏂?娉?鏉?鑾?寰?涓€ 涓?/div>
BluetoothServerSocket 瀵硅薄銆傝鏂規(guī)硶涓殑 String 鍙傛暟鏄竴涓彲璇嗗埆鐨勪綘鐨勬湇鍔$鐨勫悕縐幫紝
緋葷粺浼?xì)鑷姩鐨勬妸瀹冨啓鍏ヨ畱证囦笂鐨?Service Discovery Protocol錛圫DP錛夋暟鎹簱瀹炰綋錛堣鍚嶇О
鏄換鎰忕殑錛屽茍涓斿彲浠ョ畝鍗曠殑浣跨敤浣犵殑搴旂敤紼嬪簭鐨勫悕縐幫級銆俇UID 鍙傛暟涔熶細(xì)琚寘鍚湪 SDP 瀹炰綋涓紝
騫朵笖鏄窡瀹㈡埛绔澶囪繛鎺ョ殑鍩烘湰鍗忚銆備篃灝辨槸璇達(dá)紝褰撳鎴風(fēng)灝濊瘯璺熸湇鍔$榪炴帴鏃訛紝瀹冧細(xì)鎼哄甫
涓€涓畠鎯寵榪炴帴鐨勬湇鍔$鑳藉鍞竴璇嗗埆鐨?UUID銆傚彧鏈夊湪榪欎簺 UUID 瀹屽叏鍖歸厤鐨勬儏鍐典笅錛岃繛鎺?/div>
鎵嶅彲鑳借鎺ユ敹銆?/div>
閫氳繃璋冪敤 accept()鏂規(guī)硶錛屽惎鍔ㄨ繛鎺ヨ姹傘€傝繖鏄竴涓樆濉炶皟鐢ㄣ€傚彧鏈夊湪榪炴帴琚帴鏀舵垨鍙戠敓
寮傚父鐨勬儏鍐典笅錛岃鏂規(guī)硶鎵嶈繑鍥炪€傚彧鏈夊湪鍙戦€佽繛鎺ヨ姹傜殑榪滅▼璁懼鎵€鎼哄甫鐨?UUID 璺熺洃鍚湇鍔?/div>
濂楁帴瀛楁墍娉ㄥ唽鐨勪竴涓?UUID 鍖歸厤鐨勬椂鍊欙紝璇ヨ繛鎺ユ墠琚帴鏀躲€傝繛鎺ユ垚鍔燂紝accept()鏂規(guī)硶浼?xì)杩斿?/div>
涓€涓榪炴帴鐨?BluetoothSocket 瀵硅薄銆?/div>
闄ら潪浣犳兂瑕佹帴鏀跺叾浠栬繛鎺ワ紝鍚﹀垯瑕佽皟鐢?close()鏂規(guī)硶銆傝鏂規(guī)硶浼?xì)閲婃斁鏈嶅姟濂楁帴瀛椾互鍙?qiáng)瀹?/div>
鎵€鍗犵敤鐨勬墍鏈夎祫婧愶紝浣嗕笉浼?xì)鍏抽棴琚珮q炴帴鐨勫凡緇忔湁 accept()鏂規(guī)硶鎵€榪斿洖鐨?BluetoothSocket
瀵硅薄銆傝窡 TCP/IP 涓嶄竴鏍鳳紝姣忎釜 RFCOMM 閫氶亾涓€嬈″彧鍏佽榪炴帴涓€涓鎴風(fēng)錛屽洜姝ゅ湪澶у鏁版儏鍐?/div>
涓嬶紝鍦ㄦ帴鏀跺埌涓€涓繛鎺ュ鎺ュ瓧涔嬪悗錛岀珛鍗寵皟鐢?BluetoothServerSocket 瀵硅薄鐨?close()鏂規(guī)硶
鏄湁閬撶悊鐨勩€?/div>
accept()鏂規(guī)硶鐨勮皟鐢ㄤ笉搴旇鍦ㄤ富 Activity 鐨?UI 綰跨▼涓鎵ц錛屽洜涓鴻璋冪敤鏄樆濉炵殑錛?/div>
榪欎細(xì)闃繪搴旂敤紼嬪簭鐨勫叾浠栦氦浜掋€傞€氬父鍦ㄧ敱搴旂敤紼嬪簭鎵€綆$悊鐨勪竴涓柊鐨勭嚎紼嬩腑鏉ヤ嬌鐢?/div>
BluetoothServerSocket 瀵硅薄鎴?BluetoothSocket 瀵硅薄鏉ュ伐浣溿€傝緇堟璇稿 accept()榪欐牱鐨?/div>
闃誨璋冪敤鏂規(guī)硶錛屽氨瑕佷粠鍙︿竴涓嚎紼嬩腑璋冪敤 BluetoothServerSocket 瀵硅薄錛堟垨 BluetoothSocket
瀵硅薄錛夌殑 close()鏂規(guī)硶錛岃繖鏃墮樆濉炰細(xì)绔嬪嵆榪斿洖銆傛敞鎰忓湪 BluetoothServerSocket 鎴?/div>
BluetoothSocket 瀵硅薄涓婄殑鎵€鏈夋柟娉曢兘鏄嚎紼嬪畨鍏ㄧ殑銆?/div>
紺轟緥
浠ヤ笅鏄竴涓綆€鍖栫殑鎺ユ敹榪炴帴璇鋒眰鐨勬湇鍔$緇勪歡錛?/div>
 public class AcceptThread extends Thread{
 private BluetoothServerSocket mServerSocket;
 public AcceptThread(){
 BluetoothServerSocket tmp = null;
 try {
 tmp = mController.getmAdapter()
.listenUsingRfcommWithServiceRecord("BluetoothServer", 
UUID.fromString(getPackageName()));
 } catch (IOException e) {
 e.printStackTrace();
 }
 mServerSocket = tmp;
 }
 @Override
 public void run() {
 super.run();
 BluetoothSocket socket = null;
 //涓嶆柇鐩戝惉鐩村埌榪斿洖榪炴帴鎴栬€呭彂鐢熷紓甯?/div>
 while (true){
 try {
 //鍚繛鎺ヨ姹傦紝榪欐槸涓€涓樆濉炴柟娉曪紝蹇呴』鏀懼湪瀛愮嚎紼?/div>
 socket = mServerSocket.accept();
 } catch (IOException e) {
 e.printStackTrace();
 }
 //寤虹珛浜嗚繛鎺?/div>
 if(socket!=null){
 //綆$悊榪炴帴(鍦ㄤ竴涓嫭绔嬬殑綰跨▼閲岃繘琛?
 manageConnectedSocket(socket);
 try {
 mServerSocket.close();//鍏抽棴榪炴帴
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }
 }
 /**
 * 鍙栨秷姝e湪鐩戝惉鐨勬帴鍙?/div>
 */
 public void cancel(){
 try {
 mServerSocket.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 public void manageConnectedSocket(BluetoothSocket socket){
 }
鍦ㄨ繖涓緥瀛愪腑錛屽彧甯屾湜鏈変竴涓懠鍏ヨ繛鎺ワ紝鍥犳榪炴帴涓€鏃﹁鎺ユ敹錛屽茍鑾峰彇浜嗕竴涓?/div>
BluetoothSocket 瀵硅薄錛屽簲鐢ㄧ▼搴忓氨浼?xì)鎶婅幏寰楃?BluetoothSocket 瀵硅薄鍙戦€佺粰涓€涓嫭绔嬬殑綰?/div>
紼嬶紝鐒跺悗鍏抽棴 BluetoothServerSocket 瀵硅薄騫朵腑鏂驚鐜€?/div>
娉ㄦ剰錛屽湪 accept()鏂規(guī)硶榪斿洖 BluetoothSocket 瀵硅薄鏃訛紝濂楁帴瀛楀凡緇忔槸琚繛鎺ョ殑錛屽洜姝?/div>
浣犱笉搴旇鍐嶈皟鐢ㄥ儚瀹㈡埛绔偅鏍瘋皟鐢?connect()鏂規(guī)硶浜嗐€?/div>
搴旂敤紼嬪簭涓殑 manageConnectedSocket()鏂規(guī)硶鏄竴涓嚜瀹氫箟鏂規(guī)硶錛屽畠浼?xì)鍒濆鍖栫敤浜庝紶杈?/div>
鏁版嵁鐨勭嚎紼嬨€?/div>
閫氬父錛屼竴鏃︿綘鐩戝惉瀹屾垚鍛煎叆榪炴帴錛屽氨搴旇鍏抽棴 BluetoothServerSocket 瀵硅薄銆傚湪榪欎釜紺?/div>
渚嬩腑錛宑lose()鏂規(guī)硶鏄湪鑾峰緱 BluetoothSocket 瀵硅薄涔嬪悗琚皟鐢ㄧ殑銆備綘鍙兘榪樻兂瑕佹彁渚涗竴涓?/div>
鍏叡鏂規(guī)硶錛屼互渚垮湪浣犵殑綰跨▼涓兘澶熷叧闂綘鎯寵緇堟鐩戝惉鐨勬湇鍔″鎺ュ瓧浜嬩歡涓殑縐佹湁
BluetoothSocket 瀵硅薄銆?/div>
浣滀負(fù)榪炴帴鐨勫鎴風(fēng)
涓轟簡鍒濆鍖栦竴涓笌榪滅▼璁懼錛堟寔鏈夋墦寮€鐨勬湇鍔″鎺ュ瓧鐨勮澶囷級鐨勮繛鎺ワ紝棣栧厛蹇呴』鑾峰彇涓?/div>
浠h〃榪滅▼璁懼鐨?BluetoothDevice 瀵硅薄銆傜劧鍚庝嬌鐢?BluetoothDevice 瀵硅薄鏉ヨ幏鍙栦竴涓?/div>
BluetoothSocket 瀵硅薄錛屽茍鍒濆鍖栬榪炴帴銆?/div>
浠ヤ笅鏄竴涓熀鏈殑榪炴帴榪囩▼錛?/div>
1. 閫氳繃璋冪敤 BluetoothDevice 鐨?createRfcommSocketToServiceRecord(UUID)鏂規(guī)硶錛?/div>
鑾峰緱涓€涓?BluetoothSocket 瀵硅薄銆傝繖涓柟娉曚細(xì)鍒濆鍖栦竴涓繛鎺ュ埌 BluetoothDevice 瀵硅薄鐨?/div>
BluetoothSocket 瀵?璞?銆?浼?閫?緇?榪?涓?鏂?娉?鐨?UUID 鍙?鏁?蹇?欏?涓?鏈?鍔?绔?璁?澶?鎵?寮€
BluetoothServerSocket 瀵硅薄鏃舵墍浣跨敤鐨?UUID 鐩稿尮閰嶃€傚湪浣犵殑搴旂敤紼嬪簭涓畝鍗曠殑浣跨敤紜紪
鐮佽繘琛屾瘮瀵癸紝濡傛灉鍖歸厤錛屾湇鍔$鍜屽鎴風(fēng)浠g爜灝卞彲浠ュ簲鐢ㄨ繖涓?BluetoothSocket 瀵硅薄浜嗐€?/div>
閫氳繃璋冪敤 connect()鏂規(guī)硶鏉ュ垵濮嬪寲榪炴帴銆傚湪榪欎釜璋冪敤涓紝涓轟簡鎵懼埌鍖歸厤鐨?UUID錛岀郴緇熶細(xì)
鍦ㄨ繙紼嬬殑璁懼涓婃墽琛屼竴涓?SDP 鏌ヨ銆傚鏋滄煡璇㈡垚鍔燂紝騫朵笖榪滅▼璁懼鎺ユ敹浜嗚榪炴帴璇鋒眰錛岄偅涔?/div>
瀹冧細(xì)鍦ㄨ繛鎺ユ湡闂村叡浜嬌鐢?RFCOMM 閫氶亾錛屽茍涓?connect()鏂規(guī)硶浼?xì)杩斿洖銆傝繖涓柟娉曟槸涓€涓樆濉?/div>
璋冪敤銆傚鏋滃洜涓烘煇浜涘師鍥狅紝榪炴帴澶辮觸鎴栬繛鎺ヨ秴鏃訛紙澶х害鍦?12 縐掍箣鍚庯級錛屽氨浼?xì)鎶涘囖Z竴涓紓甯搞€?/div>
鍥犱負(fù) connect()鏂規(guī)硶鏄樆濉炶皟鐢紝榪欎釜榪炴帴榪囩▼濮嬬粓搴旇鍦ㄧ嫭绔嬩笌涓?Activity 綰跨▼涔?/div>
澶栫殑綰跨▼涓鎵ц銆?/div>
娉ㄦ剰錛氬湪璋冪敤 connect()鏂規(guī)硶鏃訛紝搴旇濮嬬粓紜繚璁懼娌℃湁姝e湪鎵ц璁懼鍙戠幇鎿嶄綔銆傚鏋?/div>
鏄湪鍙戠幇鎿嶄綔鐨勮繃紼嬩腑錛岄偅涔堣繛鎺ュ皾璇曚細(xì)鏄庢樉鐨勫彉鎱紝騫朵笖鏇村儚鏄澶辮觸鐨勬牱瀛愩€?/div>
紺轟緥
浠ヤ笅鏄垵濮嬪寲钃濈墮榪炴帴綰跨▼鐨勪竴涓熀鏈殑渚嬪瓙錛?/div>
 public class ConnectThread extends Thread{
 private BluetoothDevice mDevice;
 private BluetoothSocket mSocket;
 public ConnectThread(BluetoothDevice device){
 BluetoothSocket temp = null;
 mDevice = device;
 try {
 temp = 
mDevice.createRfcommSocketToServiceRecord(UUID.fromString(getPackageName()));
 } catch (IOException e) {
 e.printStackTrace();
 }
 mSocket = temp;
 }
 @Override
 public void run() {
 super.run();
 //鍙栨秷鎼滅儲鍥犱負(fù)鎼滅儲浼?xì)璁q炴帴鍙樻參
 mController.getmAdapter().cancelDiscovery();
 try {
 //閫氳繃 socket 榪炴帴璁懼錛岃繖鏄竴涓樆濉炴搷浣滐紝鐭ラ亾榪炴帴鎴愬姛鎴栧彂鐢熷紓甯?/div>
 mSocket.connect();
 } catch (IOException e) {
 //鏃犳硶榪炴帴錛屽叧闂?socket 騫朵笖閫€鍑?/div>
 try {
 mSocket.close();
 } catch (IOException e1) {
 e1.printStackTrace();
 }
 }
 //綆$悊榪炴帴(鍦ㄧ嫭绔嬬殑綰跨▼)
 // manageConnectedSocket(mmSocket);
 }
 /**
 * 鍙栨秷姝e湪榪涜鐨勯摼鎺ワ紝鍏抽棴 socket
 */
 public void cancel() {
 try {
 mSocket.close();
 } catch (IOException e) { }
 }
 }
鍦ㄥ緩绔嬭繛鎺ヤ箣鍓嶈璋冪敤 cancelDiscovery()鏂規(guī)硶銆傚湪榪炴帴涔嬪墠搴旇濮嬬粓璋冪敤榪欎釜鏂規(guī)硶錛?/div>
騫朵笖涓嶇敤瀹為檯鐨勬鏌ヨ摑鐗欏彂鐜板鐞嗘槸鍚︽鍦ㄨ繍琛屼篃鏄畨鍏ㄧ殑錛堝鏋滄兂瑕佹鏌ワ紝璋冪敤
isDiscovering()鏂規(guī)硶錛夈€?/div>
manageConnectedSocket()鏂規(guī)硶鏄竴涓簲鐢ㄧ▼搴忎腑鑷畾涔夌殑鏂規(guī)硶錛屽畠浼?xì)鍒濆鍖栦紶杈撴暟鎹?/div>
鐨勭嚎紼嬨€?/div>
褰撲嬌鐢ㄥ畬 BluetoothSocket 瀵硅薄鏃訛紝瑕佸緇堣皟鐢?close()鏂規(guī)硶鏉ヨ繘琛屾竻鐞嗗伐浣溿€傝繖鏍峰仛
浼?xì)绔嬪崨_叧闂榪炴帴鐨勫鎺ュ瓧錛屽茍娓呯悊鎵€鏈夌殑鍐呴儴璧勬簮銆?/div>
濂戒簡錛岃繖綃囨枃绔犲氨鍒拌繖閲屻€傚ぇ瀹朵粩緇嗙悊瑙d綋浼?xì)銆備笅闈㈢粰鍑烘簮鐮佺殑涓嬭澆鍦板潃
瀹㈡埛绔細(xì)http://download.csdn.net/detail/small_lee/9453107
鏈嶅姟绔細(xì)http://download.csdn.net/detail/small_lee/9453105

 

------鍒嗛殧綰?---------------------------
鍏蟲敞Java1234寰俊鍏紬鍙?/strong>
鎺ㄨ崘璧勬枡
锘?!-- //搴曢儴妯℃澘 -->