如何使用Android蓝牙开发

\u5982\u4f55\u4f7f\u7528Android\u84dd\u7259\u5f00\u53d1

\u3000\u3000\u8f6c\u8f7d Android\u5e73\u53f0\u652f\u6301\u84dd\u7259\u7f51\u7edc\u534f\u8bae\u6808\uff0c\u5b9e\u73b0\u84dd\u7259\u8bbe\u5907\u4e4b\u95f4\u6570\u636e\u7684\u65e0\u7ebf\u4f20\u8f93\u3002\u672c\u6587\u6863\u63cf\u8ff0\u4e86\u600e\u6837\u5229\u7528android\u5e73\u53f0\u63d0\u4f9b\u7684\u84dd\u7259API\u53bb\u5b9e\u73b0\u84dd\u538b\u8bbe\u5907\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u84dd\u7259\u5177\u6709point-to-point \u548c multipoint\u4e24\u79cd\u8fde\u63a5\u529f\u80fd\u3002
\u3000\u3000\u4f7f\u7528\u84dd\u7259API\uff0c\u53ef\u4ee5\u505a\u5230\uff1a
\u3000\u3000* \u641c\u7d22\u84dd\u7259\u8bbe\u5907
\u3000\u3000* \u4ece\u672c\u5730\u7684Bluetooth adapter\u4e2d\u67e5\u8be2\u5df2\u7ecf\u914d\u5bf9\u7684\u8bbe\u5907
\u3000\u3000* \u5efa\u7acbRFCOMM\u901a\u9053
\u3000\u3000* \u901a\u8fc7service discovery\u8fde\u63a5\u5230\u5176\u5b83\u8bbe\u5907
\u3000\u3000* \u5728\u8bbe\u5907\u4e4b\u95f4\u4f20\u8f93\u6570\u636e
\u3000\u3000* \u7ba1\u7406\u591a\u4e2a\u8fde\u63a5

\u3000\u3000\u57fa\u7840\u77e5\u8bc6
\u3000\u3000\u672c\u6587\u6863\u4ecb\u7ecd\u4e86\u5982\u4f55\u4f7f\u7528Android\u7684\u84dd\u7259API\u6765\u5b8c\u6210\u7684\u56db\u4e2a\u5fc5\u8981\u7684\u4e3b\u8981\u4efb\u52a1\uff0c\u4f7f\u7528\u84dd\u7259\u8fdb\u884c\u8bbe\u5907\u901a\u4fe1\uff0c\u4e3b\u8981\u5305\u542b\u56db\u4e2a\u90e8\u5206\uff1a\u84dd\u7259\u8bbe\u7f6e\u3001\u641c\u7d22\u8bbe\u5907\uff08\u914d\u5bf9\u7684\u6216\u53ef\u89c1\u7684\uff09\u3001\u8fde\u63a5\u3001\u4f20\u8f93\u6570\u636e\u3002
\u3000\u3000\u6240\u6709\u7684\u84dd\u7259API\u5728android.bluetooth\u5305\u4e2d\u3002\u5b9e\u73b0\u8fd9\u4e9b\u529f\u80fd\u4e3b\u8981\u9700\u8981\u4e0b\u9762\u8fd9\u51e0\u4e2a\u7c7b\u548c\u63a5\u53e3\uff1a

\u3000\u3000BluetoothAdapter
\u3000\u3000\u4ee3\u8868\u672c\u5730\u84dd\u7259\u9002\u914d\u5668\uff08\u84dd\u7259\u53d1\u5c04\u5668\uff09\uff0c\u662f\u6240\u6709\u84dd\u7259\u4ea4\u4e92\u7684\u5165\u53e3\u3002\u901a\u8fc7\u5b83\u53ef\u4ee5\u641c\u7d22\u5176\u5b83\u84dd\u7259\u8bbe\u5907\uff0c\u67e5\u8be2\u5df2\u7ecf\u914d\u5bf9\u7684\u8bbe\u5907\u5217\u8868\uff0c\u901a\u8fc7\u5df2\u77e5\u7684MAC\u5730\u5740\u521b\u5efaBluetoothDevice\uff0c\u521b\u5efaBluetoothServerSocket\u76d1\u542c\u6765\u81ea\u5176\u5b83\u8bbe\u5907\u7684\u901a\u4fe1\u3002

\u3000\u3000BluetoothDevice
\u3000\u3000\u4ee3\u8868\u4e86\u4e00\u4e2a\u8fdc\u7aef\u7684\u84dd\u7259\u8bbe\u5907\uff0c \u4f7f\u7528\u5b83\u8bf7\u6c42\u8fdc\u7aef\u84dd\u7259\u8bbe\u5907\u8fde\u63a5\u6216\u8005\u83b7\u53d6 \u8fdc\u7aef\u84dd\u7259\u8bbe\u5907\u7684\u540d\u79f0\u3001\u5730\u5740\u3001\u79cd\u7c7b\u548c\u7ed1\u5b9a\u72b6\u6001\u3002 \uff08\u5176\u4fe1\u606f\u662f\u5c01\u88c5\u5728 bluetoothsocket \u4e2d\uff09 \u3002

\u3000\u3000BluetoothSocket
\u3000\u3000\u4ee3\u8868\u4e86\u4e00\u4e2a\u84dd\u7259\u5957\u63a5\u5b57\u7684\u63a5\u53e3\uff08\u7c7b\u4f3c\u4e8e tcp \u4e2d\u7684\u5957\u63a5\u5b57\uff09 \uff0c\u4ed6\u662f\u5e94\u7528\u7a0b \u5e8f\u901a\u8fc7\u8f93\u5165\u3001\u8f93\u51fa\u6d41\u4e0e\u5176\u4ed6\u84dd\u7259\u8bbe\u5907\u901a\u4fe1\u7684\u8fde\u63a5\u70b9\u3002

\u3000\u3000BluetoothServerSocket
\u3000\u3000\u4ee3\u8868\u6253\u5f00\u670d\u52a1\u8fde\u63a5\u6765\u76d1\u542c\u53ef\u80fd\u5230\u6765\u7684\u8fde\u63a5\u8bf7\u6c42 \uff08\u5c5e\u4e8e server \u7aef\uff09 \uff0c \u4e3a\u4e86\u8fde\u63a5\u4e24\u4e2a\u84dd\u7259\u8bbe\u5907\u5fc5\u987b\u6709\u4e00\u4e2a\u8bbe\u5907\u4f5c\u4e3a\u670d\u52a1\u5668\u6253\u5f00\u4e00\u4e2a\u670d\u52a1\u5957\u63a5\u5b57\u3002 \u5f53\u8fdc\u7aef\u8bbe\u5907\u53d1\u8d77\u8fde \u63a5\u8fde\u63a5\u8bf7\u6c42\u7684\u65f6\u5019\uff0c\u5e76\u4e14\u5df2\u7ecf\u8fde\u63a5\u5230\u4e86\u7684\u65f6\u5019\uff0cBlueboothserversocket \u7c7b\u5c06\u4f1a\u8fd4\u56de\u4e00\u4e2a bluetoothsocket\u3002

\u3000\u3000BluetoothClass
\u3000\u3000\u63cf\u8ff0\u4e86\u4e00\u4e2a\u8bbe\u5907\u7684\u7279\u6027\uff08profile\uff09\u6216\u8be5\u8bbe\u5907\u4e0a\u7684\u84dd\u7259\u5927\u81f4\u53ef\u4ee5\u63d0\u4f9b\u54ea\u4e9b\u670d\u52a1(service)\uff0c\u4f46\u4e0d\u53ef\u4fe1\u3002\u6bd4\u5982\uff0c\u8bbe\u5907\u662f\u4e00\u4e2a\u7535\u8bdd\u3001\u8ba1\u7b97\u673a\u6216\u624b\u6301\u8bbe\u5907\uff1b\u8bbe\u5907\u53ef\u4ee5\u63d0\u4f9baudio/telephony\u670d\u52a1\u7b49\u3002\u53ef\u4ee5\u7528\u5b83\u6765\u8fdb\u884c\u4e00\u4e9bUI\u4e0a\u7684\u63d0\u793a\u3002
\u3000\u3000BluetoothProfile

\u3000\u3000BluetoothHeadset
\u3000\u3000\u63d0\u4f9b\u624b\u673a\u4f7f\u7528\u84dd\u7259\u8033\u673a\u7684\u652f\u6301\u3002\u8fd9\u65e2\u5305\u62ec\u84dd\u7259\u8033\u673a\u548c\u514d\u63d0\uff08V1.5\uff09\u6a21\u5f0f\u3002

\u3000\u3000BluetoothA2dp
\u3000\u3000\u5b9a\u4e49\u9ad8\u54c1\u8d28\u7684\u97f3\u9891\uff0c\u53ef\u4ee5\u4ece\u4e00\u4e2a\u8bbe\u5907\u4f20\u8f93\u5230\u53e6\u4e00\u4e2a\u84dd\u7259\u8fde\u63a5\u3002 \u201cA2DP\u7684\u201d\u4ee3\u8868\u9ad8\u7ea7\u97f3\u9891\u5206\u914d\u6a21\u5f0f\u3002

\u3000\u3000BluetoothHealth
\u3000\u3000\u4ee3\u8868\u4e86\u533b\u7597\u8bbe\u5907\u914d\u7f6e\u4ee3\u7406\u63a7\u5236\u7684\u84dd\u7259\u670d\u52a1

\u3000\u3000BluetoothHealthCallback
\u3000\u3000\u4e00\u4e2a\u62bd\u8c61\u7c7b\uff0c\u4f7f\u7528\u5b9e\u73b0BluetoothHealth\u56de\u8c03\u3002\u4f60\u5fc5\u987b\u6269\u5c55\u8fd9\u4e2a\u7c7b\u5e76\u5b9e\u73b0\u56de\u8c03\u65b9\u6cd5\u63a5\u6536\u66f4\u65b0\u5e94\u7528\u7a0b\u5e8f\u7684\u6ce8\u518c\u72b6\u6001\u548c\u84dd\u7259\u901a\u9053\u72b6\u6001\u7684\u53d8\u5316\u3002

\u3000\u3000BluetoothHealthAppConfiguration
\u3000\u3000\u4ee3\u8868\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\uff0c\u84dd\u7259\u533b\u7597\u7b2c\u4e09\u65b9\u5e94\u7528\u6ce8\u518c\u4e0e\u8fdc\u7a0b\u84dd\u7259\u533b\u7597\u8bbe\u5907\u4ea4\u6d41\u3002

\u3000\u3000BluetoothProfile.ServiceListener
\u3000\u3000\u5f53\u4ed6\u4eec\u5df2\u7ecf\u8fde\u63a5\u5230\u6216\u4ece\u670d\u52a1\u65ad\u5f00\u65f6\u901a\u77e5BluetoothProfile IPX\u7684\u5ba2\u6237\u65f6\u4e00\u4e2a\u63a5\u53e3\uff08\u5373\u8fd0\u884c\u4e00\u4e2a\u7279\u5b9a\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5185\u90e8\u670d\u52a1\uff09\u3002

\u3000\u3000\u84dd\u7259\u6743\u9650
\u3000\u3000\u4e3a\u4e86\u5728\u4f60\u7684\u5e94\u7528\u4e2d\u4f7f\u7528\u84dd\u7259\u529f\u80fd\uff0c\u81f3\u5c11\u8981\u5728AndroidManifest.xml\u4e2d\u58f0\u660e\u4e24\u4e2a\u6743\u9650\uff1aBLUETOOTH\uff08\u4efb\u4f55\u84dd\u7259\u76f8\u5173API\u90fd\u8981\u4f7f\u7528\u8fd9\u4e2a\u6743\u9650\uff09 \u548c BLUETOOTH_ADMIN\uff08\u8bbe\u5907\u641c\u7d22\u3001\u84dd\u7259\u8bbe\u7f6e\u7b49\uff09\u3002

\u3000\u3000\u4e3a\u4e86\u6267\u884c\u84dd\u7259\u901a\u4fe1\uff0c\u4f8b\u5982\u8fde\u63a5\u8bf7\u6c42\uff0c\u63a5\u6536\u8fde\u63a5\u548c\u4f20\u9001\u6570\u636e\u90fd\u5fc5\u987b\u6709BLUETOOTH\u6743\u9650\u3002

\u3000\u3000\u5fc5\u987b\u8981\u6c42BLUETOOTH_ADMIN\u7684\u6743\u9650\u6765\u542f\u52a8\u8bbe\u5907\u53d1\u73b0\u6216\u64cd\u7eb5\u84dd\u7259\u8bbe\u7f6e\u3002\u5927\u591a\u6570\u5e94\u7528\u7a0b\u5e8f\u90fd\u9700\u8981\u8fd9\u4e2a\u6743\u9650\u80fd\u529b\uff0c\u53d1\u73b0\u5f53\u5730\u7684\u84dd\u7259\u8bbe\u5907\u3002\u6b64\u6743\u9650\u6388\u4e88\u5176\u4ed6\u7684\u80fd\u529b\u4e0d\u5e94\u8be5\u4f7f\u7528\uff0c\u9664\u975e\u5e94\u7528\u7a0b\u5e8f\u662f\u4e00\u4e2a\u201c\u7535\u6e90\u7ba1\u7406\u201d\uff0c\u5c06\u6839\u636e\u7528\u6237\u8981\u6c42\u4fee\u6539\u7684\u84dd\u7259\u8bbe\u7f6e

\u3000\u3000\u6ce8\u91ca\uff1a\u8981\u8bf7\u6c42BLUETOOTH_ADMIN\u7684\u8bdd\uff0c\u5fc5\u987b\u8981\u5148\u6709BLUETOOTH\u3002

\u3000\u3000\u5728\u4f60\u7684\u5e94\u7528manifest \u6587\u4ef6\u4e2d\u58f0\u660e\u84dd\u7259\u6743\u9650\u3002\u4f8b\u5982\uff1a

\u3000\u3000
\u3000\u3000
\u3000\u3000...
\u3000\u3000
\u3000\u3000\u901a\u8fc7\u67e5\u770b\u8d44\u6599\u6765\u58f0\u660e\u5e94\u7528\u6743\u9650\u83b7\u53d6\u66f4\u591a\u7684\u4fe1\u606f\u3002

\u3000\u3000\u84dd\u7259\u8bbe\u7f6e
\u3000\u3000\u5728\u4f60\u7684\u5e94\u7528\u901a\u8fc7\u84dd\u7259\u8fdb\u884c\u901a\u4fe1\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u786e\u8ba4\u8bbe\u5907\u662f\u5426\u652f\u6301\u84dd\u7259\uff0c\u5982\u679c\u652f\u6301\uff0c\u786e\u4fe1\u5b83\u88ab\u6253\u5f00\u3002

\u3000\u3000\u5982\u679c\u4e0d\u652f\u6301\uff0c\u5219\u4e0d\u80fd\u4f7f\u7528\u84dd\u7259\u529f\u80fd\u3002\u5982\u679c\u652f\u6301\u84dd\u7259\uff0c\u4f46\u4e0d\u80fd\u591f\u4f7f\u7528\uff0c\u4f60\u521a\u8981\u5728\u4f60\u7684\u5e94\u7528\u4e2d\u8bf7\u6c42\u4f7f\u7528\u84dd\u7259\u3002\u8fd9\u4e2a\u8981\u4e24\u6b65\u5b8c\u6210\uff0c\u4f7f\u7528BluetoothAdapter\u3002

\u3000\u30001.\u83b7\u53d6BluetoothAdapter

\u3000\u3000\u6240\u6709\u7684\u84dd\u7259\u6d3b\u52a8\u8bf7\u6c42BluetoothAdapter\uff0c\u4e3a\u4e86\u83b7\u53d6BluetoothAdapter\uff0c\u547c\u53eb\u9759\u6001\u65b9\u6cd5getDefaultAdapter() \u3002\u8fd9\u4e2a\u4f1a\u8fd4\u56de\u4e00\u4e2aBluetoothAdapter\uff0c\u4ee3\u8868\u8bbe\u5907\u81ea\u5df1\u7684\u84dd\u7259\u9002\u914d\u5668\uff08\u84dd\u7259\u65e0\u7ebf\u7535\uff09\u3002\u8fd9\u4e2a\u84dd\u7259\u9002\u914d\u5668\u5e94\u7528\u4e8e\u6574\u4e2a\u7cfb\u7edf\u4e2d\uff0c\u4f60\u7684\u5e94\u7528\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e2a\u5bf9\u8c61\u8fdb\u884c\u4ea4\u4e92\u3002\u5982\u679cgetDefaultAdapter()\u8fd4\u56denull,\u5219\u8fd9\u4e2a\u8bbe\u5907\u4e0d\u652f\u6301\u84dd\u7259\u3002\u4f8b\u5982\uff1a

\u3000\u3000BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
\u3000\u3000if (mBluetoothAdapter == null) {
\u3000\u3000// Device does not support Bluetooth
\u3000\u3000}
\u3000\u30002.\u6253\u5f00\u84dd\u7259

\u3000\u3000\u5176\u6b21\u3002\u4f60\u9700\u8981\u786e\u5b9a\u84dd\u7259\u80fd\u591f\u4f7f\u7528\u3002\u901a\u8fc7isEnabled()\u6765\u68c0\u67e5\u84dd\u7259\u5f53\u524d\u662f\u5426\u53ef\u7528\u3002\u5982\u679c\u8fd9\u4e2a\u65b9\u6cd5\u8fd4\u56defalse,\u5219\u84dd\u7259\u4e0d\u80fd\u591f\u4f7f\u7528\u3002\u4e3a\u4e86\u8bf7\u6c42\u84dd\u7259\u4f7f\u7528\uff0c\u547c\u53ebstartActivityForResult\uff08\uff09\u4e0e\u7684ACTION_REQUEST_ENABLE\u52a8\u4f5c\u610f\u56fe\u3002\u901a\u8fc7\u7cfb\u7edf\u8bbe\u7f6e\u4e2d\u542f\u7528\u84dd\u7259\u5c06\u53d1\u51fa\u4e00\u4e2a\u8bf7\u6c42\uff08\u4e0d\u505c\u6b62\u84dd\u7259\u5e94\u7528)\u3002\u4f8b\u5982\uff1a

\u3000\u3000if (mBluetoothAdapter.isEnabled()) {
\u3000\u3000Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
\u3000\u3000startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
\u3000\u3000}
\u3000\u3000![http://developer.android.com/images/bt_enable_request.png]

\u3000\u3000\u5bf9\u8bdd\u6846\u4e2d\u663e\u793a\u8bf7\u6c42\u4f7f\u7528\u84dd\u7259\u6743\u9650\u3002\u5982\u679c\u54cd\u5e94"Yes",\u8fd9\u4e2a\u8fdb\u7a0b\u5b8c\u6210\uff08\u6216\u5931\u8d25\uff09\u540e\u4f60\u7684\u5e94\u7528\u5c06\u80fd\u591f\u4f7f\u7528\u84dd\u7259\u3002
\u3000\u3000REQUEST_ENABLE_BT\u5e38\u91cf\u4f5c\u4e3a\u4e00\u4e2a\u6574\u578b\u4f20\u5230startActivityForResult()\u4e2d\uff08\u503c\u5fc5\u987b\u5927\u4e8e0\uff09\uff0c\u8be5\u7cfb\u7edf\u4f20\u56de\u7ed9\u4f60\uff0c\u5728\u4f60onActivityResult\uff08\uff09\u4f5c\u4e3a\u5b9e\u73b0\u7684requestCode\u53c2\u6570\u3002

\u3000\u3000\u5982\u679c\u8c03\u7528\u84dd\u7259\u6210\u529f\uff0c\u4f60\u7684Activity\u5c31\u4f1a\u5728onActivityResult()\u4e2d\u6536\u5230RESULT_OK\u7ed3\u679c\uff0c\u5982\u679c\u84dd\u7259\u4e0d\u80fd\u4f7f\u7528\u7531\u4e8e\u9519\u8bef\uff08\u6216\u7528\u6237\u54cd\u5e94\u201cNO\u201d\u90a3\u4e48\u7ed3\u679c\u8fd4\u56deRESULT_CANCELED\u3002

\u3000\u3000\u9664\u4e86\u901a\u8fc7onActivityResult()\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7\u76d1\u542cACTION_STATE_CHANGED\u8fd9\u4e2abroadcast Intent\u6765\u77e5\u9053\u84dd\u7259\u72b6\u6001\u662f\u5426\u6539\u53d8\u3002\u8fd9\u4e2aIntent\u5305\u542bEXTRA_STATE,EXTRA_PREVIOUS_STATE\u4e24\u4e2a\u5b57\u6bb5\uff0c\u5206\u522b\u4ee3\u8868\u65b0\u65e7\u72b6\u6001\u3002\u53ef\u80fd\u7684\u503c\u662fSTATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF, \u8fd8\u6709STATE_OFF\u3002

\u3000\u3000\u5c0f\u8d34\uff1a Enabling discoverability \u5c06\u81ea\u52a8\u542f\u7528\u84dd\u7259\u3002\u5982\u679c\u60a8\u8ba1\u5212\u6267\u884c\u84dd\u7259\u6d3b\u52a8\u4e4b\u524d\uff0c\u59cb\u7ec8\u4f7f\u8bbe\u5907\u53ef\u53d1\u73b0\uff0c\u4f60\u53ef\u4ee5\u8df3\u8fc7\u4e0a\u9762\u7684\u6b65\u9aa42\u3002\u53c2\u9605enabling discoverability\u3002

\u3000\u3000\u641c\u7d22\u8bbe\u5907
\u3000\u3000\u4f7f\u7528BluetoothAdapter\u53ef\u4ee5\u901a\u8fc7\u8bbe\u5907\u641c\u7d22\u6216\u67e5\u8be2\u914d\u5bf9\u8bbe\u5907\u627e\u5230\u8fdc\u7a0bBluetooth\u8bbe\u5907\u3002

\u3000\u3000Device discovery\uff08\u8bbe\u5907\u641c\u7d22\uff09\u662f\u4e00\u4e2a\u626b\u63cf\u641c\u7d22\u672c\u5730\u5df2\u4f7f\u80fdBluetooth\u8bbe\u5907\u5e76\u4e14\u4ece\u641c\u7d22\u5230\u7684\u8bbe\u5907\u8bf7\u6c42\u4e00\u4e9b\u4fe1\u606f\u7684\u8fc7\u7a0b\uff08\u6709\u65f6\u5019\u4f1a\u6536\u5230\u7c7b\u4f3c\u201cdiscovering\u201d\uff0c\u201cinquiring\u201d\u6216\u201cscanning\u201d\uff09\u3002\u4f46\u662f\uff0c\u641c\u7d22\u5230\u7684\u672c\u5730Bluetooth\u8bbe\u5907\u53ea\u6709\u5728\u6253\u5f00\u88ab\u53d1\u73b0\u529f\u80fd\u540e\u624d\u4f1a\u54cd\u5e94\u4e00\u4e2adiscovery\u8bf7\u6c42\uff0c\u54cd\u5e94\u7684\u4fe1\u606f\u5305\u62ec\u8bbe\u5907\u540d\uff0c\u7c7b\uff0c\u552f\u4e00\u7684MAC\u5730\u5740\u3002\u53d1\u8d77\u641c\u5bfb\u7684\u8bbe\u5907\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b\u4fe1\u606f\u6765\u521d\u59cb\u5316\u8ddf\u88ab\u53d1\u73b0\u7684\u8bbe\u5907\u7684\u8fde\u63a5\u3002
\u3000\u3000\u4e00\u65e6\u4e0e\u8fdc\u7a0b\u8bbe\u5907\u7684\u7b2c\u4e00\u6b21\u8fde\u63a5\u88ab\u5efa\u7acb\uff0c\u4e00\u4e2apairing\u8bf7\u6c42\u5c31\u4f1a\u81ea\u52a8\u63d0\u4ea4\u7ed9\u7528\u6237\u3002\u5982\u679c\u8bbe\u5907\u5df2\u914d\u5bf9\uff0c\u914d\u5bf9\u8bbe\u5907\u7684\u57fa\u672c\u4fe1\u606f\uff08\u540d\u79f0\uff0c\u7c7b\uff0cMAC\u5730\u5740\uff09\u5c31\u88ab\u4fdd\u5b58\u4e0b\u6765\u4e86\uff0c\u80fd\u591f\u4f7f\u7528Bluetooth API\u6765\u8bfb\u53d6\u8fd9\u4e9b\u4fe1\u606f\u3002\u4f7f\u7528\u5df2\u77e5\u7684\u8fdc\u7a0b\u8bbe\u5907\u7684MAC\u5730\u5740\uff0c\u8fde\u63a5\u53ef\u4ee5\u5728\u4efb\u4f55\u65f6\u5019\u521d\u59cb\u5316\u800c\u4e0d\u5fc5\u5148\u5b8c\u6210\u641c\u7d22\uff08\u5f53\u7136\u8fd9\u662f\u5047\u8bbe\u8fdc\u7a0b\u8bbe\u5907\u662f\u5728\u53ef\u8fde\u63a5\u7684\u7a7a\u95f4\u8303\u56f4\u5185\uff09\u3002

\u3000\u3000\u9700\u8981\u8bb0\u4f4f\uff0c\u914d\u5bf9\u548c\u8fde\u63a5\u662f\u4e24\u4e2a\u4e0d\u540c\u7684\u6982\u5ff5\uff1a

\u3000\u3000\u914d\u5bf9\u610f\u601d\u662f\u4e24\u4e2a\u8bbe\u5907\u76f8\u4e92\u610f\u8bc6\u5230\u5bf9\u65b9\u7684\u5b58\u5728\uff0c\u5171\u4eab\u4e00\u4e2a\u7528\u6765\u9274\u522b\u8eab\u4efd\u7684\u94fe\u8def\u952e\uff08link-key\uff09\uff0c\u80fd\u591f\u4e0e\u5bf9\u65b9\u5efa\u7acb\u4e00\u4e2a\u52a0\u5bc6\u7684\u8fde\u63a5\u3002

\u3000\u3000\u8fde\u63a5\u610f\u601d\u662f\u4e24\u4e2a\u8bbe\u5907\u73b0\u5728\u5171\u4eab\u4e00\u4e2aRFCOMM\u4fe1\u9053\uff0c\u80fd\u591f\u76f8\u4e92\u4f20\u8f93\u6570\u636e\u3002

\u3000\u3000\u76ee\u524dAndroid Bluetooth API's\u8981\u6c42\u8bbe\u5907\u5728\u5efa\u7acbRFCOMM\u4fe1\u9053\u524d\u5fc5\u987b\u914d\u5bf9\uff08\u914d\u5bf9\u662f\u5728\u4f7f\u7528Bluetooth API\u521d\u59cb\u5316\u4e00\u4e2a\u52a0\u5bc6\u8fde\u63a5\u65f6\u81ea\u52a8\u5b8c\u6210\u7684\uff09\u3002

\u3000\u3000\u4e0b\u9762\u63cf\u8ff0\u5982\u4f55\u67e5\u8be2\u5df2\u914d\u5bf9\u8bbe\u5907\uff0c\u641c\u7d22\u65b0\u8bbe\u5907\u3002

\u3000\u3000\u6ce8\u610f\uff1aAndroid\u7684\u7535\u6e90\u8bbe\u5907\u9ed8\u8ba4\u662f\u4e0d\u80fd\u88ab\u53d1\u73b0\u7684\u3002\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u7cfb\u7edf\u8bbe\u7f6e\u8ba9\u5b83\u5728\u6709\u9650\u7684\u65f6\u95f4\u5185\u53ef\u4ee5\u88ab\u53d1\u73b0\uff0c\u6216\u8005\u53ef\u4ee5\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\u8981\u6c42\u7528\u6237\u4f7f\u80fd\u88ab\u53d1\u73b0\u529f\u80fd\u3002

\u3000\u3000\u67e5\u627e\u5339\u914d\u8bbe\u5907
\u3000\u3000\u5728\u641c\u7d22\u8bbe\u5907\u524d\uff0c\u67e5\u8be2\u914d\u5bf9\u8bbe\u5907\u770b\u9700\u8981\u7684\u8bbe\u5907\u662f\u5426\u5df2\u7ecf\u662f\u5df2\u7ecf\u5b58\u5728\u662f\u5f88\u503c\u5f97\u7684\uff0c\u53ef\u4ee5\u8c03\u7528getBondedDevices()\u6765\u505a\u5230\uff0c\u8be5\u51fd\u6570\u4f1a\u8fd4\u56de\u4e00\u4e2a\u63cf\u8ff0\u914d\u5bf9\u8bbe\u5907BluetoothDevice\u7684\u7ed3\u679c\u96c6\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528ArrayAdapter\u67e5\u8be2\u6240\u6709\u914d\u5bf9\u8bbe\u5907\u7136\u540e\u663e\u793a\u6240\u6709\u8bbe\u5907\u540d\u7ed9\u7528\u6237\uff1a

\u3000\u3000Set pairedDevices = mBluetoothAdapter.getBondedDevices();
\u3000\u3000// If there are paired devices
\u3000\u3000if (pairedDevices.size() > 0) {
\u3000\u3000// Loop through paired devices
\u3000\u3000for (BluetoothDevice device : pairedDevices) {
\u3000\u3000// Add the name and address to an array adapter to show in a ListView
\u3000\u3000mArrayAdapter.add(device.getName() + "n" + device.getAddress());
\u3000\u3000}
\u3000\u3000};
\u3000\u3000BluetoothDevice\u5bf9\u8c61\u4e2d\u9700\u8981\u7528\u6765\u521d\u59cb\u5316\u4e00\u4e2a\u8fde\u63a5\u552f\u4e00\u9700\u8981\u7528\u5230\u7684\u4fe1\u606f\u5c31\u662fMAC\u5730\u5740\u3002

Android\u5e73\u53f0\u652f\u6301\u84dd\u7259\u7f51\u7edc\u534f\u8bae\u6808\uff0c\u5b9e\u73b0\u84dd\u7259\u8bbe\u5907\u4e4b\u95f4\u6570\u636e\u7684\u65e0\u7ebf\u4f20\u8f93\u3002\u672c\u6587\u6863\u63cf\u8ff0\u4e86\u600e\u6837\u5229\u7528android\u5e73\u53f0\u63d0\u4f9b\u7684\u84dd\u7259API\u53bb\u5b9e\u73b0\u84dd\u538b\u8bbe\u5907\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u84dd\u7259\u5177\u6709point-to-point \u548c multipoint\u4e24\u79cd\u8fde\u63a5\u529f\u80fd\u3002\u4f7f\u7528\u84dd\u7259API\uff0c\u53ef\u4ee5\u505a\u5230\uff1a
* \u641c\u7d22\u84dd\u7259\u8bbe\u5907
* \u4ece\u672c\u5730\u7684Bluetooth adapter\u4e2d\u67e5\u8be2\u5df2\u7ecf\u914d\u5bf9\u7684\u8bbe\u5907
* \u5efa\u7acbRFCOMM\u901a\u9053
* \u901a\u8fc7service discovery\u8fde\u63a5\u5230\u5176\u5b83\u8bbe\u5907
* \u5728\u8bbe\u5907\u4e4b\u95f4\u4f20\u8f93\u6570\u636e
* \u7ba1\u7406\u591a\u4e2a\u8fde\u63a5

\u57fa\u7840\u77e5\u8bc6
\u672c\u6587\u6863\u4ecb\u7ecd\u4e86\u5982\u4f55\u4f7f\u7528Android\u7684\u84dd\u7259API\u6765\u5b8c\u6210\u7684\u56db\u4e2a\u5fc5\u8981\u7684\u4e3b\u8981\u4efb\u52a1\uff0c\u4f7f\u7528\u84dd\u7259\u8fdb\u884c\u8bbe\u5907\u901a\u4fe1\uff0c\u4e3b\u8981\u5305\u542b\u56db\u4e2a\u90e8\u5206\uff1a\u84dd\u7259\u8bbe\u7f6e\u3001\u641c\u7d22\u8bbe\u5907\uff08\u914d\u5bf9\u7684\u6216\u53ef\u89c1\u7684\uff09\u3001\u8fde\u63a5\u3001\u4f20\u8f93\u6570\u636e\u3002
\u6240\u6709\u7684\u84dd\u7259API\u5728android.bluetooth\u5305\u4e2d\u3002\u5b9e\u73b0\u8fd9\u4e9b\u529f\u80fd\u4e3b\u8981\u9700\u8981\u4e0b\u9762\u8fd9\u51e0\u4e2a\u7c7b\u548c\u63a5\u53e3\uff1a

BluetoothAdapter
\u4ee3\u8868\u672c\u5730\u84dd\u7259\u9002\u914d\u5668\uff08\u84dd\u7259\u53d1\u5c04\u5668\uff09\uff0c\u662f\u6240\u6709\u84dd\u7259\u4ea4\u4e92\u7684\u5165\u53e3\u3002\u901a\u8fc7\u5b83\u53ef\u4ee5\u641c\u7d22\u5176\u5b83\u84dd\u7259\u8bbe\u5907\uff0c\u67e5\u8be2\u5df2\u7ecf\u914d\u5bf9\u7684\u8bbe\u5907\u5217\u8868\uff0c\u901a\u8fc7\u5df2\u77e5\u7684MAC\u5730\u5740\u521b\u5efaBluetoothDevice\uff0c\u521b\u5efaBluetoothServerSocket\u76d1\u542c\u6765\u81ea\u5176\u5b83\u8bbe\u5907\u7684\u901a\u4fe1\u3002

BluetoothDevice
\u4ee3\u8868\u4e86\u4e00\u4e2a\u8fdc\u7aef\u7684\u84dd\u7259\u8bbe\u5907\uff0c \u4f7f\u7528\u5b83\u8bf7\u6c42\u8fdc\u7aef\u84dd\u7259\u8bbe\u5907\u8fde\u63a5\u6216\u8005\u83b7\u53d6 \u8fdc\u7aef\u84dd\u7259\u8bbe\u5907\u7684\u540d\u79f0\u3001\u5730\u5740\u3001\u79cd\u7c7b\u548c\u7ed1\u5b9a\u72b6\u6001\u3002 \uff08\u5176\u4fe1\u606f\u662f\u5c01\u88c5\u5728 bluetoothsocket \u4e2d\uff09 \u3002

BluetoothSocket
\u4ee3\u8868\u4e86\u4e00\u4e2a\u84dd\u7259\u5957\u63a5\u5b57\u7684\u63a5\u53e3\uff08\u7c7b\u4f3c\u4e8e tcp \u4e2d\u7684\u5957\u63a5\u5b57\uff09 \uff0c\u4ed6\u662f\u5e94\u7528\u7a0b \u5e8f\u901a\u8fc7\u8f93\u5165\u3001\u8f93\u51fa\u6d41\u4e0e\u5176\u4ed6\u84dd\u7259\u8bbe\u5907\u901a\u4fe1\u7684\u8fde\u63a5\u70b9\u3002

BluetoothServerSocket
\u4ee3\u8868\u6253\u5f00\u670d\u52a1\u8fde\u63a5\u6765\u76d1\u542c\u53ef\u80fd\u5230\u6765\u7684\u8fde\u63a5\u8bf7\u6c42 \uff08\u5c5e\u4e8e server \u7aef\uff09 \uff0c \u4e3a\u4e86\u8fde\u63a5\u4e24\u4e2a\u84dd\u7259\u8bbe\u5907\u5fc5\u987b\u6709\u4e00\u4e2a\u8bbe\u5907\u4f5c\u4e3a\u670d\u52a1\u5668\u6253\u5f00\u4e00\u4e2a\u670d\u52a1\u5957\u63a5\u5b57\u3002 \u5f53\u8fdc\u7aef\u8bbe\u5907\u53d1\u8d77\u8fde \u63a5\u8fde\u63a5\u8bf7\u6c42\u7684\u65f6\u5019\uff0c\u5e76\u4e14\u5df2\u7ecf\u8fde\u63a5\u5230\u4e86\u7684\u65f6\u5019\uff0cBlueboothserversocket \u7c7b\u5c06\u4f1a\u8fd4\u56de\u4e00\u4e2a bluetoothsocket\u3002

BluetoothClass
\u63cf\u8ff0\u4e86\u4e00\u4e2a\u8bbe\u5907\u7684\u7279\u6027\uff08profile\uff09\u6216\u8be5\u8bbe\u5907\u4e0a\u7684\u84dd\u7259\u5927\u81f4\u53ef\u4ee5\u63d0\u4f9b\u54ea\u4e9b\u670d\u52a1(service)\uff0c\u4f46\u4e0d\u53ef\u4fe1\u3002\u6bd4\u5982\uff0c\u8bbe\u5907\u662f\u4e00\u4e2a\u7535\u8bdd\u3001\u8ba1\u7b97\u673a\u6216\u624b\u6301\u8bbe\u5907\uff1b\u8bbe\u5907\u53ef\u4ee5\u63d0\u4f9baudio/telephony\u670d\u52a1\u7b49\u3002\u53ef\u4ee5\u7528\u5b83\u6765\u8fdb\u884c\u4e00\u4e9bUI\u4e0a\u7684\u63d0\u793a\u3002
BluetoothProfile

BluetoothHeadset
\u63d0\u4f9b\u624b\u673a\u4f7f\u7528\u84dd\u7259\u8033\u673a\u7684\u652f\u6301\u3002\u8fd9\u65e2\u5305\u62ec\u84dd\u7259\u8033\u673a\u548c\u514d\u63d0\uff08V1.5\uff09\u6a21\u5f0f\u3002

BluetoothA2dp
\u5b9a\u4e49\u9ad8\u54c1\u8d28\u7684\u97f3\u9891\uff0c\u53ef\u4ee5\u4ece\u4e00\u4e2a\u8bbe\u5907\u4f20\u8f93\u5230\u53e6\u4e00\u4e2a\u84dd\u7259\u8fde\u63a5\u3002 \u201cA2DP\u7684\u201d\u4ee3\u8868\u9ad8\u7ea7\u97f3\u9891\u5206\u914d\u6a21\u5f0f\u3002

BluetoothHealth
\u4ee3\u8868\u4e86\u533b\u7597\u8bbe\u5907\u914d\u7f6e\u4ee3\u7406\u63a7\u5236\u7684\u84dd\u7259\u670d\u52a1

BluetoothHealthCallback
\u4e00\u4e2a\u62bd\u8c61\u7c7b\uff0c\u4f7f\u7528\u5b9e\u73b0BluetoothHealth\u56de\u8c03\u3002\u4f60\u5fc5\u987b\u6269\u5c55\u8fd9\u4e2a\u7c7b\u5e76\u5b9e\u73b0\u56de\u8c03\u65b9\u6cd5\u63a5\u6536\u66f4\u65b0\u5e94\u7528\u7a0b\u5e8f\u7684\u6ce8\u518c\u72b6\u6001\u548c\u84dd\u7259\u901a\u9053\u72b6\u6001\u7684\u53d8\u5316\u3002

BluetoothHealthAppConfiguration
\u4ee3\u8868\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\uff0c\u84dd\u7259\u533b\u7597\u7b2c\u4e09\u65b9\u5e94\u7528\u6ce8\u518c\u4e0e\u8fdc\u7a0b\u84dd\u7259\u533b\u7597\u8bbe\u5907\u4ea4\u6d41\u3002

BluetoothProfile.ServiceListener
\u5f53\u4ed6\u4eec\u5df2\u7ecf\u8fde\u63a5\u5230\u6216\u4ece\u670d\u52a1\u65ad\u5f00\u65f6\u901a\u77e5BluetoothProfile IPX\u7684\u5ba2\u6237\u65f6\u4e00\u4e2a\u63a5\u53e3\uff08\u5373\u8fd0\u884c\u4e00\u4e2a\u7279\u5b9a\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5185\u90e8\u670d\u52a1\uff09\u3002

  1. Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输。本文档描述了怎样利用android平台提供的蓝牙API去实现蓝压设备之间的通信。蓝牙具有point-to-point 和 multipoint两种连接功能。
      使用蓝牙API,可以做到:
      * 搜索蓝牙设备
      * 从本地的Bluetooth adapter中查询已经配对的设备
      * 建立RFCOMM通道
      * 通过service discovery连接到其它设备
      * 在设备之间传输数据
      * 管理多个连接

  2. 基础知识
      本文档介绍了如何使用Android的蓝牙API来完成的四个必要的主要任务,使用蓝牙进行设备通信,主要包含四个部分:蓝牙设置、搜索设备(配对的或可见的)、连接、传输数据。
      所有的蓝牙API在android.bluetooth包中。实现这些功能主要需要下面这几个类和接口:

      BluetoothAdapter
      代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。
      BluetoothDevice
      代表了一个远端的蓝牙设备, 使用它请求远端蓝牙设备连接或者获取 远端蓝牙设备的名称、地址、种类和绑定状态。 (其信息是封装在 bluetoothsocket 中) 。
      BluetoothSocket
      代表了一个蓝牙套接字的接口(类似于 tcp 中的套接字) ,他是应用程 序通过输入、输出流与其他蓝牙设备通信的连接点。
      BluetoothServerSocket
     
     代表打开服务连接来监听可能到来的连接请求 (属于 server 端) , 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。
    当远端设备发起连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个
    bluetoothsocket。
      BluetoothClass
      描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。
      BluetoothProfile
      BluetoothHeadset
      提供手机使用蓝牙耳机的支持。这既包括蓝牙耳机和免提(V1.5)模式。
      BluetoothA2dp
      定义高品质的音频,可以从一个设备传输到另一个蓝牙连接。 “A2DP的”代表高级音频分配模式。
      BluetoothHealth
      代表了医疗设备配置代理控制的蓝牙服务
      BluetoothHealthCallback
      一个抽象类,使用实现BluetoothHealth回调。你必须扩展这个类并实现回调方法接收更新应用程序的注册状态和蓝牙通道状态的变化。
      BluetoothHealthAppConfiguration
      代表一个应用程序的配置,蓝牙医疗第三方应用注册与远程蓝牙医疗设备交流。
      BluetoothProfile.ServiceListener
      当他们已经连接到或从服务断开时通知BluetoothProfile IPX的客户时一个接口(即运行一个特定的配置文件,内部服务)。

  3. 蓝牙权限
           为了在你的应用中使用蓝牙功能,至少要在AndroidManifest.xml中声明两个权限:BLUETOOTH(任何蓝牙相关API都要使用这个权限) 和 BLUETOOTH_ADMIN(设备搜索、蓝牙设置等)。

  4. 为了执行蓝牙通信,例如连接请求,接收连接和传送数据都必须有BLUETOOTH权限。

  5. 必须要求BLUETOOTH_ADMIN的权限来启动设备发现或操纵蓝牙设置。大多数应用程序都需要这个权限能力,发现当地的蓝牙设备。此权限授予其他的能力不应该使用,除非应用程序是一个“电源管理”,将根据用户要求修改的蓝牙设置



  Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输。本文档描述了怎样利用android平台提供的蓝牙API去实现蓝压设备之间的通信。蓝牙具有point-to-point 和 multipoint两种连接功能。
  使用蓝牙API,可以做到:
  * 搜索蓝牙设备
  * 从本地的Bluetooth adapter中查询已经配对的设备
  * 建立RFCOMM通道
  * 通过service discovery连接到其它设备
  * 在设备之间传输数据
  * 管理多个连接

  基础知识
  本文档介绍了如何使用Android的蓝牙API来完成的四个必要的主要任务,使用蓝牙进行设备通信,主要包含四个部分:蓝牙设置、搜索设备(配对的或可见的)、连接、传输数据。
  所有的蓝牙API在android.bluetooth包中。实现这些功能主要需要下面这几个类和接口:

  BluetoothAdapter
  代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。

  BluetoothDevice
  代表了一个远端的蓝牙设备, 使用它请求远端蓝牙设备连接或者获取 远端蓝牙设备的名称、地址、种类和绑定状态。 (其信息是封装在 bluetoothsocket 中) 。

  BluetoothSocket
  代表了一个蓝牙套接字的接口(类似于 tcp 中的套接字) ,他是应用程 序通过输入、输出流与其他蓝牙设备通信的连接点。

  BluetoothServerSocket
  代表打开服务连接来监听可能到来的连接请求 (属于 server 端) , 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。 当远端设备发起连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个 bluetoothsocket。

  BluetoothClass
  描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。
  BluetoothProfile

  BluetoothHeadset
  提供手机使用蓝牙耳机的支持。这既包括蓝牙耳机和免提(V1.5)模式。

  BluetoothA2dp
  定义高品质的音频,可以从一个设备传输到另一个蓝牙连接。 “A2DP的”代表高级音频分配模式。

  BluetoothHealth
  代表了医疗设备配置代理控制的蓝牙服务

  BluetoothHealthCallback
  一个抽象类,使用实现BluetoothHealth回调。你必须扩展这个类并实现回调方法接收更新应用程序的注册状态和蓝牙通道状态的变化。

  BluetoothHealthAppConfiguration
  代表一个应用程序的配置,蓝牙医疗第三方应用注册与远程蓝牙医疗设备交流。

  BluetoothProfile.ServiceListener
  当他们已经连接到或从服务断开时通知BluetoothProfile IPX的客户时一个接口(即运行一个特定的配置文件,内部服务)。

  蓝牙权限
  为了在你的应用中使用蓝牙功能,至少要在AndroidManifest.xml中声明两个权限:BLUETOOTH(任何蓝牙相关API都要使用这个权限) 和 BLUETOOTH_ADMIN(设备搜索、蓝牙设置等)。

  为了执行蓝牙通信,例如连接请求,接收连接和传送数据都必须有BLUETOOTH权限。

  必须要求BLUETOOTH_ADMIN的权限来启动设备发现或操纵蓝牙设置。大多数应用程序都需要这个权限能力,发现当地的蓝牙设备。此权限授予其他的能力不应该使用,除非应用程序是一个“电源管理”,将根据用户要求修改的蓝牙设置

  注释:要请求BLUETOOTH_ADMIN的话,必须要先有BLUETOOTH。

  在你的应用manifest 文件中声明蓝牙权限。例如:

  1
  2
  3
  4 <manifest ... >
  <uses-permission android:name="android.permission.BLUETOOTH" />
  ...
  </manifest>
  

  通过查看<uses-permission>资料来声明应用权限获取更多的信息。

  蓝牙设置
  在你的应用通过蓝牙进行通信之前,你需要确认设备是否支持蓝牙,如果支持,确信它被打开。

  如果不支持,则不能使用蓝牙功能。如果支持蓝牙,但不能够使用,你刚要在你的应用中请求使用蓝牙。这个要两步完成,使用BluetoothAdapter。

  1.获取BluetoothAdapter

  所有的蓝牙活动请求BluetoothAdapter,为了获取BluetoothAdapter,呼叫静态方法getDefaultAdapter() 。这个会返回一个BluetoothAdapter,代表设备自己的蓝牙适配器(蓝牙无线电)。这个蓝牙适配器应用于整个系统中,你的应用可以通过这个对象进行交互。如果getDefaultAdapter()返回null,则这个设备不支持蓝牙。例如:

  1
  2
  3
  4 BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  if (mBluetoothAdapter == null) {
  // Device does not support Bluetooth
  }
  

  2.打开蓝牙

  其次。你需要确定蓝牙能够使用。通过isEnabled()来检查蓝牙当前是否可用。如果这个方法返回false,则蓝牙不能够使用。为了请求蓝牙使用,呼叫startActivityForResult()与的ACTION_REQUEST_ENABLE动作意图。通过系统设置中启用蓝牙将发出一个请求(不停止蓝牙应用)。例如:

  1
  2
  3
  4 if (mBluetoothAdapter.isEnabled()) {
  Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
  }
  

  ![http://developer.android.com/images/bt_enable_request.png]

  对话框中显示请求使用蓝牙权限。如果响应"Yes",这个进程完成(或失败)后你的应用将能够使用蓝牙。
  REQUEST_ENABLE_BT常量作为一个整型传到startActivityForResult()中(值必须大于0),该系统传回给你,在你onActivityResult()作为实现的requestCode参数。

  如果调用蓝牙成功,你的Activity就会在onActivityResult()中收到RESULT_OK结果,如果蓝牙不能使用由于错误(或用户响应“NO”那么结果返回RESULT_CANCELED。

  除了通过onActivityResult(),还可以通过监听ACTION_STATE_CHANGED这个broadcast Intent来知道蓝牙状态是否改变。这个Intent包含EXTRA_STATE,EXTRA_PREVIOUS_STATE两个字段,分别代表新旧状态。可能的值是STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF, 还有STATE_OFF。

  小贴: Enabling discoverability 将自动启用蓝牙。如果您计划执行蓝牙活动之前,始终使设备可发现,你可以跳过上面的步骤2。参阅enabling discoverability。

  搜索设备
  使用BluetoothAdapter可以通过设备搜索或查询配对设备找到远程Bluetooth设备。

  Device discovery(设备搜索)是一个扫描搜索本地已使能Bluetooth设备并且从搜索到的设备请求一些信息的过程(有时候会收到类似“discovering”,“inquiring”或“scanning”)。但是,搜索到的本地Bluetooth设备只有在打开被发现功能后才会响应一个discovery请求,响应的信息包括设备名,类,唯一的MAC地址。发起搜寻的设备可以使用这些信息来初始化跟被发现的设备的连接。
  一旦与远程设备的第一次连接被建立,一个pairing请求就会自动提交给用户。如果设备已配对,配对设备的基本信息(名称,类,MAC地址)就被保存下来了,能够使用Bluetooth API来读取这些信息。使用已知的远程设备的MAC地址,连接可以在任何时候初始化而不必先完成搜索(当然这是假设远程设备是在可连接的空间范围内)。

  需要记住,配对和连接是两个不同的概念:

  配对意思是两个设备相互意识到对方的存在,共享一个用来鉴别身份的链路键(link-key),能够与对方建立一个加密的连接。

  连接意思是两个设备现在共享一个RFCOMM信道,能够相互传输数据。

  目前Android Bluetooth API's要求设备在建立RFCOMM信道前必须配对(配对是在使用Bluetooth API初始化一个加密连接时自动完成的)。

  下面描述如何查询已配对设备,搜索新设备。

  注意:Android的电源设备默认是不能被发现的。用户可以通过系统设置让它在有限的时间内可以被发现,或者可以在应用程序中要求用户使能被发现功能。

  查找匹配设备
  在搜索设备前,查询配对设备看需要的设备是否已经是已经存在是很值得的,可以调用getBondedDevices()来做到,该函数会返回一个描述配对设备BluetoothDevice的结果集。例如,可以使用ArrayAdapter查询所有配对设备然后显示所有设备名给用户:

  1
  2
  3
  4
  5
  6
  7
  8
  9 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
  // If there are paired devices
  if (pairedDevices.size() > 0) {
  // Loop through paired devices
  for (BluetoothDevice device : pairedDevices) {
  // Add the name and address to an array adapter to show in a ListView
  mArrayAdapter.add(device.getName() + "n" + device.getAddress());
  }
  };
  

  BluetoothDevice对象中需要用来初始化一个连接唯一需要用到的信息就是MAC地址。

  扫描设备
  要开始搜索设备,只需简单的调用startDiscovery() 。该函数时异步的,调用后立即返回,返回值表示搜索是否成功开始。搜索处理通常包括一个12秒钟的查询扫描,然后跟随一个页面显示搜索到设备Bluetooth名称。

  应用中可以注册一个带ACTION_FOUND Intent的BroadcastReceiver,搜索到每一个设备时都接收到消息。对于每一个设备,系统都会广播ACTION_FOUND Intent,该Intent携带着而外的字段信息EXTRA_DEVICE和EXTRA_CLASS,分别包含一个BluetoothDevice和一个BluetoothClass。

  下面的示例显示如何注册和处理设备被发现后发出的广播:

  代码如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16 // Create a BroadcastReceiver for ACTION_FOUND
  private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
  String action = intent.getAction();
  // When discovery finds a device
  if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  // Get the BluetoothDevice object from the Intent
  BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  // Add the name and address to an array adapter to show in a ListView
  mArrayAdapter.add(device.getName() + "n" + device.getAddress());
  }
  }
  };
  // Register the BroadcastReceiver
  IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
  

  警告:完成设备搜索对于Bluetooth适配器来说是一个重量级的处理,要消耗大量它的资源。一旦你已经找到一个设备来连接,请确保你在尝试连接前使用了cancelDiscovery()来停止搜索。同样,如果已经保持了一个连接的时候,同时执行搜索设备将会显著的降低连接的带宽,所以在连接的时候不应该执行搜索发现。

  使能被发现
  如果想让本地设备被其他设备发现,可以带ACTION_REQUEST_DISCOVERABLE action Intent调用startActivityForResult(Intent, int) 方法。该方法会提交一个请求通过系统刚设置使设备出于可以被发现的模式(而不影响应用程序)。默认情况下,设备在120秒后变为可以被发现的。可以通过额外增加EXTRA_DISCOVERABLE_DURATION Intent自定义一个值,最大值是3600秒,0表示设备总是可以被发现的(小于0或者大于3600则会被自动设置为120秒)。下面示例设置时间为300:

  1
  2
  3
  4 Intent discoverableIntent = new
  Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
  startActivity(discoverableIntent);
  

  !
  [http://developer.android.com/images/bt_enable_discoverable.png]

  询问用户是否允许打开设备可以被发现功能时会显示一个对话框。如果用户选择“Yes”,设备会在指定时间过后变为可以被发现的。Activity的onActivityResult()回调函数被调用,结果码等于设备变为可以被发现所需时长。如果用户选择“No”或者有错误发生,结果码会是Activity.RESULT_CANCELLED。

  提示:如果Bluetooth没有启用,启用Bluetooth可被发现功能能够自动开启Bluetooth。

  在规定的时间内,设备会静静的保持可以被发现模式。如果想在可以被发现模式被更改时受到通知,可以用ACTION_SCAN_MODE_CHANGED Intent注册一个BroadcastReceiver,包含额外的字段信息EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE分别表示新旧扫描模式,其可能的值为SCAN_MODE_CONNECTABLE_DISCOVERABLE(discoverable mode),SCAN_MODE_CONNECTABLE(not in discoverable mode but still able to receive connections),SCAN_MODE_NONE(not in discoverable mode and unable to receive connections)。
  如果只需要连接远程设备就不需要打开设备的可以被发现功能。只在应用作为一个服务器socket的宿主用来接收进来的连接时才需要使能可以被发现功能,因为远程设备在初始化连接前必须先发现了你的设备。

  连接设备
  为了在两台设备上创建一个连接,你必须在软件上实现服务器端和客户端的机制,因为一个设备必须必须打开一个server socket,而另一个必须初始化这个连接(使用服务器端设备的MAC地址进行初始化)。
  当服务器端和客户端在同一个RFCOMM信道上都有一个BluetoothSocket时,就可以认为它们之间建立了一个连接。在这个时刻,每个设备能获得一个输出流和一个输入流,也能够开始数据传输。本节介绍如何在两个设备之间初始化一个连接。
  服务器端和客户端获得BluetoothSocket的方法是不同的,服务器端是当一个进入的连接被接受时才产生一个BluetoothSocket,客户端是在打开一个到服务器端的RFCOMM信道时获得BluetoothSocket的。

  !
  [http://developer.android.com/images/bt_pairing_request.png]

  一种实现技术是,每一个设备都自动作为一个服务器,所以每个设备都有一个server socket并监听连接。然后每个设备都能作为客户端建立一个到另一台设备的连接。另外一种代替方法是,一个设备按需打开一个server socket,另外一个设备仅初始化一个到这个设备的连接。

  Note: 如果两个设备在建立连接之前并没有配对,那么在建立连接的过程中,Android框架将自动显示一个配对请求的notification或者一个对话框,如Figure 3所示。所以,在尝试连接设备时,你的应用程序无需确保设备之间已经进行了配对。你的RFCOMM连接将会在用户确认配对之后继续进行,或者用户拒绝或者超时之后失败。

  作为服务器连接
  如果要连接两个设备,其中一个必须充当服务器,通过持有一个打开的BluetoothServerSocket对象。服务器socket的作用是侦听进来的连接,如果一个连接被接受,提供一个连接好的BluetoothSocket对象。从BluetoothServerSocket获取到BluetoothSocket对象之后,BluetoothServerSocket就可以(也应该)丢弃了,除非你还要用它来接收更多的连接。

  下面是建立服务器socket和接收一个连接的基本步骤:

  1.通过调用listenUsingRfcommWithServiceRecord(String, UUID)得到一个BluetoothServerSocket对象。

  该字符串为服务的识别名称,系统将自动写入到一个新的服务发现协议(SDP)数据库接入口到设备上的(名字是任意的,可以简单地是应用程序的名称)项。 UUID也包括在SDP接入口中,将是客户端设备连接协议的基础。也就是说,当客户端试图连接本设备,它将携带一个UUID用来唯一标识它要连接的服务,UUID必须匹配,连接才会被接受。

  2.通过调用accept()来侦听连接请求。

  这是一个阻塞的调用,知道有连接进来或者产生异常才会返回。只有远程设备发送一个连接请求,并且携带的UUID与侦听它socket注册的UUID匹配,连接请求才会被接受。如果成功,accept()将返回一个连接好的BluetoothSocket对象。

  3.除非需要再接收另外的连接,否则的话调用close() 。

  close()释放server socket和它的资源,但不会关闭连接accept()返回的连接好的BluetoothSocket对象。与TCP/IP不同,RFCOMM同一时刻一个信道只允许一个客户端连接,因此大多数情况下意味着在BluetoothServerSocket接受一个连接请求后应该立即调用close()。

  accept()调用不应该在主Activity UI线程中进行,因为这是个阻塞的调用,会妨碍其他的交互。经常是在在一个新线程中做BluetoothServerSocket或BluetoothSocket的所有工作来避免UI线程阻塞。注意所有BluetoothServerSocket或BluetoothSocket的方法都是线程安全的。

  • 濡備綍瀹炵幇android钃濈墮寮鍙 鑷姩閰嶅杩炴帴,骞朵笉寮瑰嚭鎻愮ず妗
    绛旓細濡備綍瀹炵幇android钃濈墮寮鍙 鑷姩閰嶅杩炴帴,骞朵笉寮瑰嚭鎻愮ず妗  鎴戞潵绛 1涓洖绛 #鐑# 鍙箰鏍,鏄粈涔堟爲?绾﹀畾20125 2015-01-29 路 TA鑾峰緱瓒呰繃1.4涓囦釜璧 鐭ラ亾澶ф湁鍙负绛斾富 鍥炵瓟閲:1.1涓 閲囩撼鐜:96% 甯姪鐨勪汉:3532涓 鎴戜篃鍘荤瓟棰樿闂釜浜洪〉 鍏虫敞 灞曞紑鍏ㄩ儴 鎴戝氨寮濮嬫煡鎵鎬庝箞鍏抽棴杩欎釜钃濈墮閰嶅鎻愮ず妗,...
  • 濡備綍瀹炵幇android钃濈墮寮鍙 鑷姩閰嶅杩炴帴,骞朵笉寮瑰嚭鎻愮ず妗
    绛旓細濡備綍瀹炵幇android钃濈墮寮鍙 鑷姩閰嶅杩炴帴,骞朵笉寮瑰嚭鎻愮ず妗  鎴戞潵绛 2涓洖绛 #鐑# 姝﹀ぇ闈栧湪鍐ゥ鐨勮〃鐜,鎬庝箞璇勪环鏈鎭板綋?lihongwei41 2016-01-15 路 TA鑾峰緱瓒呰繃3.9涓囦釜璧 鐭ラ亾澶ф湁鍙负绛斾富 鍥炵瓟閲:2.5涓 閲囩撼鐜:0% 甯姪鐨勪汉:4071涓 鎴戜篃鍘荤瓟棰樿闂釜浜洪〉 灞曞紑鍏ㄩ儴 Mainfest,xml娉ㄥ唽 1 <receiver...
  • Android 钃濈墮寮鍙(涓)-钃濈墮鐨勮缁嗕粙缁
    绛旓細鍓嶉潰鐨勪袱绡囨枃绔狅紝涓昏鏄湪 Android 瀹樼綉鍏充簬钃濈墮浠嬬粛鐨勫熀纭涓婂姞涓婅嚜宸辩殑鐞嗚В瀹屾垚鐨勩備富瑕侀拡瀵圭殑鏄 Android 寮鍙戜腑鐨勪竴浜 API 鐨浣跨敤銆 绗竴绡囨枃绔 Android 钃濈墮寮鍙锛堜竴锛 涓昏鏄粙缁嶄簡鏅氱殑钃濈墮鍦 Android 寮鍙戜腑鐨勮繍鐢ㄣ 绗簩绡囨枃绔 Android 钃濈墮寮鍙戯紙浜岋級 涓昏鏄粙缁嶄簡浣庡姛鑰楄摑鐗欑殑寮鍙戙
  • Android钃濈墮寮鍙浠g爜鎬庝箞鍐?
    绛旓細寮鍚钃濈墮璁惧鍜岃缃彲瑙佹椂闂达細private void search() { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (!adapter.isEnabled()) { adapter.enable(); } Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); enable.putExtra(BluetoothAdapter...
  • android 钃濈墮鎵嬫満娓告垙瀵规垬寮鍙
    绛旓細鐪媋pi锛岀劧鍚庡弬鐓android sdk閲岄潰鐨勪緥瀛(閲岄潰寰堣缁)銆備綘鍙互鍒嗕笁姝ヨ繘琛岋細1銆鐢鎸囧畾api璁钃濈墮宸ヤ綔锛2銆佸仛涓父鎴忥紱3銆佹妸娓告垙涓渶瑕佽摑鐗欎紶鎺ョ殑鏁版嵁閫氳繃钃濈墮浼犳帴銆
  • 濡備綍瀹炵幇android钃濈墮寮鍙 鑷姩閰嶅杩炴帴,骞朵笉寮瑰嚭鎻愮ず妗
    绛旓細鎴戠殑鎬濊矾鏄湪鏀跺埌锛android.bluetooth.device.action.PAIRING_REQUEST 閰嶅璇锋眰鏃惰皟鐢ㄥ彇娑堣緭鍏ユ柟娉曪紝鍦ㄦ垜浠皟鐢╟reateBond鏂规硶鏃 涓嶈鐢ㄦ埛鏄惁鍦ㄥ脊鍑烘閫夋嫨閰嶅杩樻槸鍙栨秷閰嶅 閮藉凡缁忛厤瀵规垚鍔燂紝鎵浠ュ彧瑕佹垜浠睆钄芥帀寮瑰嚭閰嶅鎻愮ず妗嗗氨鍙互浜
  • android 钃濈墮 鎬庝箞鍏ラ棬
    绛旓細Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.google鍜宐roadcom鍚堜綔寮鍙浜嗕竴涓柊钃濈墮鍗忚鏍...
  • 鍏充簬android钃濈墮瀹㈡埛绔氳寮鍙,鏈夋病鏈夊ソ鐢鐨勭涓夋柟搴
    绛旓細1銆丅LE涓婃瘮杈冩垚鐔熺殑绗笁鏂瑰紑婧愬簱鐩墠骞舵病鏈夈傚缓璁牴鎹瓽oogle瀹樻柟DEMO鍜屾枃妗o紝鑷繁鍘诲啓涓涓簱姣旇緝濂姐傚洜涓Android閲孊LE鐩稿叧鐨勭被骞朵笉澶氾紝澶ф鍗佷釜宸﹀彸锛屾帉鎻¤捣鏉ヤ笉闅撅紝鑰屼笖鑷繁鍐欑殑搴撴敼璧锋潵姣曠珶鐏垫椿鐐广2銆佸垎浜竴涓猤ithub涓婄殑ble绫诲簱锛屽啓鐨勪笉閿欙紝鍙槸骞朵笉瀹屽杽銆備富瑕佹槸鐢ㄤ簬鍙戠幇BLE鍛ㄨ竟璁惧Beacon鐨勶紝涔熷叿鏈...
  • 濡備綍浣跨敤android鍘熺敓BLE钃濈墮杩涜鎿嶄綔?
    绛旓細涓昏鏄鍐 characteristic gatt.wirteCharacteristic(mCurrentcharacteristic);gatt.readCharacteristic(characteristic);bluetoothGatt.setCharacteristicNotification(data, true);鐪熷疄宸ヤ綔涓浣跨敤鐨勮摑鐗欏簱BlueToothKit璇峰弬鑰冩垜鐨勫彟涓绡囧崥瀹: android钃濈墮鍏ラ棬鐭ヨ瘑鍜屼紭绉钃濈墮绗笁鏂瑰簱BluetoothKit鐨勪娇鐢 ...
  • Android Bluetooth鐩稿叧鎿嶄綔
    绛旓細Android 3.0寮濮 Bluetooth API 灏辨敮鎸浣跨敤钃濈墮閰嶇疆鏂囦欢銆 钃濈墮閰嶇疆鏂囦欢鏄傜敤浜庤澶囬棿钃濈墮閫氫俊鐨勬棤绾挎帴鍙h鑼冦侫ndroid 鎻愪緵浜嗕互涓嬪嚑绉嶈摑鐗欓厤缃枃浠剁殑瀹炵幇 浣跨敤钃濈墮鑰虫満闊抽浼犺緭鐢变袱绉嶆柟寮 鎵撳紑SCO鏈変袱绉嶆柟寮 娌¤澶囷紝寰呰ˉ鍏咃紝寰呴獙璇 钃濈墮浣庡姛鑰楁瑙 缁忓吀钃濈墮涓庝綆鍔熻楄摑鐗欑殑鍖哄埆 Android 钃濈墮寮鍙锛2锛夆...
  • 扩展阅读:android苹果版下载 ... 蓝牙耳机老是跟别人串 ... apple私人免费app怎么下载 ... android安卓版下载 ... android蓝牙ble开发教程 ... 手机蓝牙hid怎么打开 ... android蓝牙遥控器app ... android蓝牙app开发 ... android蓝牙作为从设备 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网