蓝牙通信的大概过程例如以下:

1。首先开启蓝牙

2,搜索可用设备

3,创建蓝牙socket。获取输入输出流

4,读取和写入数据

5。断开连接关闭蓝牙

还要发送配对码发送进行推断!

以下是全部的源码;不会非常难;认真看;

SearchDeviceActivity.java

[java] view plaincopy
  1. package com.hello.project;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Set;
  6. import android.app.Activity;
  7. import android.app.AlertDialog;
  8. import android.bluetooth.BluetoothAdapter;
  9. import android.bluetooth.BluetoothDevice;
  10. import android.content.BroadcastReceiver;
  11. import android.content.Context;
  12. import android.content.DialogInterface;
  13. import android.content.Intent;
  14. import android.content.IntentFilter;
  15. import android.os.Bundle;
  16. import android.util.Log;
  17. import android.view.View;
  18. import android.view.View.OnClickListener;
  19. import android.widget.AdapterView;
  20. import android.widget.AdapterView.OnItemClickListener;
  21. import android.widget.ArrayAdapter;
  22. import android.widget.Button;
  23. import android.widget.ListView;
  24. public class SearchDeviceActivity extends Activity implements OnItemClickListener{
  25. private BluetoothAdapter blueadapter=null;
  26. private DeviceReceiver mydevice=new DeviceReceiver();
  27. private List<String> deviceList=new ArrayList<String>();
  28. private ListView deviceListview;
  29. private Button btserch;
  30. private ArrayAdapter<String> adapter;
  31. private boolean hasregister=false;
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.finddevice);
  36. setView();
  37. setBluetooth();
  38. }
  39. private void setView(){
  40. deviceListview=(ListView)findViewById(R.id.devicelist);
  41. adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, deviceList);
  42. deviceListview.setAdapter(adapter);
  43. deviceListview.setOnItemClickListener(this);
  44. btserch=(Button)findViewById(R.id.start_seach);
  45. btserch.setOnClickListener(new ClinckMonitor());
  46. }
  47. @Override
  48. protected void onStart() {
  49. //注冊蓝牙接收广播
  50. if(!hasregister){
  51. hasregister=true;
  52. IntentFilter filterStart=new IntentFilter(BluetoothDevice.ACTION_FOUND);
  53. IntentFilter filterEnd=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  54. registerReceiver(mydevice, filterStart);
  55. registerReceiver(mydevice, filterEnd);
  56. }
  57. super.onStart();
  58. }
  59. @Override
  60. protected void onDestroy() {
  61. if(blueadapter!=null&&blueadapter.isDiscovering()){
  62. blueadapter.cancelDiscovery();
  63. }
  64. if(hasregister){
  65. hasregister=false;
  66. unregisterReceiver(mydevice);
  67. }
  68. super.onDestroy();
  69. }
  70. /**
  71. * Setting Up Bluetooth
  72. */
  73. private void setBluetooth(){
  74. blueadapter=BluetoothAdapter.getDefaultAdapter();
  75. if(blueadapter!=null){  //Device support Bluetooth
  76. //确认开启蓝牙
  77. if(!blueadapter.isEnabled()){
  78. //请求用户开启
  79. Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  80. startActivityForResult(intent, RESULT_FIRST_USER);
  81. //使蓝牙设备可见,方便配对
  82. Intent in=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  83. in.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 200);
  84. startActivity(in);
  85. //直接开启,不经过提示
  86. blueadapter.enable();
  87. }
  88. }
  89. else{   //Device does not support Bluetooth
  90. AlertDialog.Builder dialog = new AlertDialog.Builder(this);
  91. dialog.setTitle("No bluetooth devices");
  92. dialog.setMessage("Your equipment does not support bluetooth, please change device");
  93. dialog.setNegativeButton("cancel",
  94. new DialogInterface.OnClickListener() {
  95. @Override
  96. public void onClick(DialogInterface dialog, int which) {
  97. }
  98. });
  99. dialog.show();
  100. }
  101. }
  102. /**
  103. * Finding Devices
  104. */
  105. private void findAvalibleDevice(){
  106. //获取可配对蓝牙设备
  107. Set<BluetoothDevice> device=blueadapter.getBondedDevices();
  108. if(blueadapter!=null&&blueadapter.isDiscovering()){
  109. deviceList.clear();
  110. adapter.notifyDataSetChanged();
  111. }
  112. if(device.size()>0){ //存在已经配对过的蓝牙设备
  113. for(Iterator<BluetoothDevice> it=device.iterator();it.hasNext();){
  114. BluetoothDevice btd=it.next();
  115. deviceList.add(btd.getName()+'\n'+btd.getAddress());
  116. adapter.notifyDataSetChanged();
  117. }
  118. }else{  //不存在已经配对过的蓝牙设备
  119. deviceList.add("No can be matched to use bluetooth");
  120. adapter.notifyDataSetChanged();
  121. }
  122. }
  123. @Override
  124. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  125. switch(resultCode){
  126. case RESULT_OK:
  127. findAvalibleDevice();
  128. break;
  129. case RESULT_CANCELED:
  130. break;
  131. }
  132. super.onActivityResult(requestCode, resultCode, data);
  133. }
  134. private class ClinckMonitor implements OnClickListener{
  135. @Override
  136. public void onClick(View v) {
  137. if(blueadapter.isDiscovering()){
  138. blueadapter.cancelDiscovery();
  139. btserch.setText("repeat search");
  140. }else{
  141. findAvalibleDevice();
  142. blueadapter.startDiscovery();
  143. btserch.setText("stop search");
  144. }
  145. }
  146. }
  147. /**
  148. * 蓝牙搜索状态广播监听
  149. * @author Andy
  150. *
  151. */
  152. private class DeviceReceiver extends BroadcastReceiver{
  153. @Override
  154. public void onReceive(Context context, Intent intent) {
  155. String action =intent.getAction();
  156. if(BluetoothDevice.ACTION_FOUND.equals(action)){    //搜索到新设备
  157. BluetoothDevice btd=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  158. //搜索没有配过对的蓝牙设备
  159. if (btd.getBondState() != BluetoothDevice.BOND_BONDED) {
  160. deviceList.add(btd.getName()+'\n'+btd.getAddress());
  161. adapter.notifyDataSetChanged();
  162. }
  163. }
  164. else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){   //搜索结束
  165. if (deviceListview.getCount() == 0) {
  166. deviceList.add("No can be matched to use bluetooth");
  167. adapter.notifyDataSetChanged();
  168. }
  169. btserch.setText("repeat search");
  170. }
  171. }
  172. }
  173. @Override
  174. public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
  175. Log.e("msgParent", "Parent= "+arg0);
  176. Log.e("msgView", "View= "+arg1);
  177. Log.e("msgChildView", "ChildView= "+arg0.getChildAt(pos-arg0.getFirstVisiblePosition()));
  178. final String msg = deviceList.get(pos);
  179. if(blueadapter!=null&&blueadapter.isDiscovering()){
  180. blueadapter.cancelDiscovery();
  181. btserch.setText("repeat search");
  182. }
  183. AlertDialog.Builder dialog = new AlertDialog.Builder(this);// 定义一个弹出框对象
  184. dialog.setTitle("Confirmed connecting device");
  185. dialog.setMessage(msg);
  186. dialog.setPositiveButton("connect",
  187. new DialogInterface.OnClickListener() {
  188. @Override
  189. public void onClick(DialogInterface dialog, int which) {
  190. BluetoothMsg.BlueToothAddress=msg.substring(msg.length()-17);
  191. if(BluetoothMsg.lastblueToothAddress!=BluetoothMsg.BlueToothAddress){
  192. BluetoothMsg.lastblueToothAddress=BluetoothMsg.BlueToothAddress;
  193. }
  194. Intent in=new Intent(SearchDeviceActivity.this,BluetoothActivity.class);
  195. startActivity(in);
  196. }
  197. });
  198. dialog.setNegativeButton("cancel",
  199. new DialogInterface.OnClickListener() {
  200. @Override
  201. public void onClick(DialogInterface dialog, int which) {
  202. BluetoothMsg.BlueToothAddress = null;
  203. }
  204. });
  205. dialog.show();
  206. }
  207. }

BluetoothMsg.java

[java] view plaincopy
  1. package com.hello.project;
  2. public class BluetoothMsg {
  3. /**
  4. * 蓝牙连接类型
  5. * @author Andy
  6. *
  7. */
  8. public enum ServerOrCilent{
  9. NONE,
  10. SERVICE,
  11. CILENT
  12. };
  13. //蓝牙连接方式
  14. public static ServerOrCilent serviceOrCilent = ServerOrCilent.NONE;
  15. //连接蓝牙地址
  16. public static String BlueToothAddress = null,lastblueToothAddress=null;
  17. //通信线程是否开启
  18. public static boolean isOpen = false;
  19. }

finddevice.xml

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id = "@+id/devices"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <RelativeLayout
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentBottom = "true"
  12. android:id= "@+id/bt_bottombar">
  13. <Button android:id="@+id/start_seach"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:layout_toRightOf="@+id/start_service"
  17. android:text="Began to search"/>
  18. </RelativeLayout>
  19. <ListView
  20. android:id="@+id/devicelist"
  21. android:layout_width="fill_parent"
  22. android:layout_height="fill_parent"
  23. android:scrollingCache="false"
  24. android:divider="#ffc6c6c6"
  25. android:layout_weight="1.0"
  26. android:layout_above = "@id/bt_bottombar"
  27. android:layout_below="@id/devices"
  28. />
  29. </RelativeLayout>

BluetoothActivity.java

[java] view plaincopy
  1. package com.hello.project;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.UUID;
  8. import android.app.Activity;
  9. import android.bluetooth.BluetoothAdapter;
  10. import android.bluetooth.BluetoothDevice;
  11. import android.bluetooth.BluetoothServerSocket;
  12. import android.bluetooth.BluetoothSocket;
  13. import android.content.Context;
  14. import android.os.Bundle;
  15. import android.os.Handler;
  16. import android.os.Message;
  17. import android.util.Log;
  18. import android.view.View;
  19. import android.view.View.OnClickListener;
  20. import android.view.inputmethod.InputMethodManager;
  21. import android.widget.AdapterView;
  22. import android.widget.ArrayAdapter;
  23. import android.widget.Button;
  24. import android.widget.EditText;
  25. import android.widget.ListView;
  26. import android.widget.Toast;
  27. import android.widget.AdapterView.OnItemClickListener;
  28. public class BluetoothActivity extends  Activity{
  29. /* 一些常量。代表server的名称 */
  30. public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";
  31. private ListView mListView;
  32. private Button sendButton;
  33. private Button disconnectButton;
  34. private EditText editMsgView;
  35. private ArrayAdapter<String> mAdapter;
  36. private List<String> msgList=new ArrayList<String>();
  37. Context mContext;
  38. private BluetoothServerSocket mserverSocket = null;
  39. private ServerThread startServerThread = null;
  40. private clientThread clientConnectThread = null;
  41. private BluetoothSocket socket = null;
  42. private BluetoothDevice device = null;
  43. private readThread mreadThread = null;;
  44. private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  45. @Override
  46. public void onCreate(Bundle savedInstanceState) {
  47. super.onCreate(savedInstanceState);
  48. setContentView(R.layout.chat);
  49. mContext = this;
  50. init();
  51. }
  52. private void init() {
  53. mAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, msgList);
  54. mListView = (ListView) findViewById(R.id.list);
  55. mListView.setAdapter(mAdapter);
  56. mListView.setFastScrollEnabled(true);
  57. editMsgView= (EditText)findViewById(R.id.MessageText);
  58. editMsgView.clearFocus();
  59. sendButton= (Button)findViewById(R.id.btn_msg_send);
  60. sendButton.setOnClickListener(new OnClickListener() {
  61. @Override
  62. public void onClick(View arg0) {
  63. String msgText =editMsgView.getText().toString();
  64. if (msgText.length()>0) {
  65. sendMessageHandle(msgText);
  66. editMsgView.setText("");
  67. editMsgView.clearFocus();
  68. //close InputMethodManager
  69. InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
  70. imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0);
  71. }else
  72. Toast.makeText(mContext, "发送内容不能为空!", Toast.LENGTH_SHORT).show();
  73. }
  74. });
  75. disconnectButton= (Button)findViewById(R.id.btn_disconnect);
  76. disconnectButton.setOnClickListener(new OnClickListener() {
  77. @Override
  78. public void onClick(View arg0) {
  79. // TODO Auto-generated method stub
  80. if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.CILENT)
  81. {
  82. shutdownClient();
  83. }
  84. else if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.SERVICE)
  85. {
  86. shutdownServer();
  87. }
  88. BluetoothMsg.isOpen = false;
  89. BluetoothMsg.serviceOrCilent=BluetoothMsg.ServerOrCilent.NONE;
  90. Toast.makeText(mContext, "已断开连接。", Toast.LENGTH_SHORT).show();
  91. }
  92. });
  93. }
  94. private Handler LinkDetectedHandler = new Handler() {
  95. @Override
  96. public void handleMessage(Message msg) {
  97. //Toast.makeText(mContext, (String)msg.obj, Toast.LENGTH_SHORT).show();
  98. if(msg.what==1)
  99. {
  100. msgList.add((String)msg.obj);
  101. }
  102. else
  103. {
  104. msgList.add((String)msg.obj);
  105. }
  106. mAdapter.notifyDataSetChanged();
  107. mListView.setSelection(msgList.size() - 1);
  108. }
  109. };
  110. @Override
  111. protected void onResume() {
  112. BluetoothMsg.serviceOrCilent=BluetoothMsg.ServerOrCilent.CILENT;
  113. if(BluetoothMsg.isOpen)
  114. {
  115. Toast.makeText(mContext, "连接已经打开。能够通信。假设要再建立连接,请先断开!

    "

    , Toast.LENGTH_SHORT).show();

  116. return;
  117. }
  118. if(BluetoothMsg.serviceOrCilent==BluetoothMsg.ServerOrCilent.CILENT)
  119. {
  120. String address = BluetoothMsg.BlueToothAddress;
  121. if(!address.equals("null"))
  122. {
  123. device = mBluetoothAdapter.getRemoteDevice(address);
  124. clientConnectThread = new clientThread();
  125. clientConnectThread.start();
  126. BluetoothMsg.isOpen = true;
  127. }
  128. else
  129. {
  130. Toast.makeText(mContext, "address is null !", Toast.LENGTH_SHORT).show();
  131. }
  132. }
  133. else if(BluetoothMsg.serviceOrCilent==BluetoothMsg.ServerOrCilent.SERVICE)
  134. {
  135. startServerThread = new ServerThread();
  136. startServerThread.start();
  137. BluetoothMsg.isOpen = true;
  138. }
  139. super.onResume();
  140. }
  141. //开启client
  142. private class clientThread extends Thread {
  143. @Override
  144. public void run() {
  145. try {
  146. //创建一个Socket连接:仅仅须要server在注冊时的UUID号
  147. // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
  148. socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
  149. //连接
  150. Message msg2 = new Message();
  151. msg2.obj = "请稍候。正在连接server:"+BluetoothMsg.BlueToothAddress;
  152. msg2.what = 0;
  153. LinkDetectedHandler.sendMessage(msg2);
  154. socket.connect();
  155. Message msg = new Message();
  156. msg.obj = "已经连接上服务端。能够发送信息。";
  157. msg.what = 0;
  158. LinkDetectedHandler.sendMessage(msg);
  159. //启动接受数据
  160. mreadThread = new readThread();
  161. mreadThread.start();
  162. }
  163. catch (IOException e)
  164. {
  165. Log.e("connect", "", e);
  166. Message msg = new Message();
  167. msg.obj = "连接服务端异常!断开连接又一次试一试。";
  168. msg.what = 0;
  169. LinkDetectedHandler.sendMessage(msg);
  170. }
  171. }
  172. };
  173. //开启server
  174. private class ServerThread extends Thread {
  175. @Override
  176. public void run() {
  177. try {
  178. /* 创建一个蓝牙server
  179. * 參数分别:server名称、UUID   */
  180. mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
  181. UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
  182. Log.d("server", "wait cilent connect...");
  183. Message msg = new Message();
  184. msg.obj = "请稍候。正在等待client的连接...";
  185. msg.what = 0;
  186. LinkDetectedHandler.sendMessage(msg);
  187. /* 接受client的连接请求 */
  188. socket = mserverSocket.accept();
  189. Log.d("server", "accept success !");
  190. Message msg2 = new Message();
  191. String info = "client已经连接上!能够发送信息。";
  192. msg2.obj = info;
  193. msg.what = 0;
  194. LinkDetectedHandler.sendMessage(msg2);
  195. //启动接受数据
  196. mreadThread = new readThread();
  197. mreadThread.start();
  198. } catch (IOException e) {
  199. e.printStackTrace();
  200. }
  201. }
  202. };
  203. /* 停止server */
  204. private void shutdownServer() {
  205. new Thread() {
  206. @Override
  207. public void run() {
  208. if(startServerThread != null)
  209. {
  210. startServerThread.interrupt();
  211. startServerThread = null;
  212. }
  213. if(mreadThread != null)
  214. {
  215. mreadThread.interrupt();
  216. mreadThread = null;
  217. }
  218. try {
  219. if(socket != null)
  220. {
  221. socket.close();
  222. socket = null;
  223. }
  224. if (mserverSocket != null)
  225. {
  226. mserverSocket.close();/* 关闭服务器 */
  227. mserverSocket = null;
  228. }
  229. } catch (IOException e) {
  230. Log.e("server", "mserverSocket.close()", e);
  231. }
  232. };
  233. }.start();
  234. }
  235. /* 停止client连接 */
  236. private void shutdownClient() {
  237. new Thread() {
  238. @Override
  239. public void run() {
  240. if(clientConnectThread!=null)
  241. {
  242. clientConnectThread.interrupt();
  243. clientConnectThread= null;
  244. }
  245. if(mreadThread != null)
  246. {
  247. mreadThread.interrupt();
  248. mreadThread = null;
  249. }
  250. if (socket != null) {
  251. try {
  252. socket.close();
  253. } catch (IOException e) {
  254. // TODO Auto-generated catch block
  255. e.printStackTrace();
  256. }
  257. socket = null;
  258. }
  259. };
  260. }.start();
  261. }
  262. //发送数据
  263. private void sendMessageHandle(String msg)
  264. {
  265. if (socket == null)
  266. {
  267. Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();
  268. return;
  269. }
  270. try {
  271. OutputStream os = socket.getOutputStream();
  272. os.write(msg.getBytes());
  273. } catch (IOException e) {
  274. e.printStackTrace();
  275. }
  276. msgList.add(msg);
  277. mAdapter.notifyDataSetChanged();
  278. mListView.setSelection(msgList.size() - 1);
  279. }
  280. //读取数据
  281. private class readThread extends Thread {
  282. @Override
  283. public void run() {
  284. byte[] buffer = new byte[1024];
  285. int bytes;
  286. InputStream mmInStream = null;
  287. try {
  288. mmInStream = socket.getInputStream();
  289. } catch (IOException e1) {
  290. // TODO Auto-generated catch block
  291. e1.printStackTrace();
  292. }
  293. while (true) {
  294. try {
  295. // Read from the InputStream
  296. if( (bytes = mmInStream.read(buffer)) > 0 )
  297. {
  298. byte[] buf_data = new byte[bytes];
  299. for(int i=0; i<bytes; i++)
  300. {
  301. buf_data[i] = buffer[i];
  302. }
  303. String s = new String(buf_data);
  304. Message msg = new Message();
  305. msg.obj = s;
  306. msg.what = 1;
  307. LinkDetectedHandler.sendMessage(msg);
  308. }
  309. } catch (IOException e) {
  310. try {
  311. mmInStream.close();
  312. } catch (IOException e1) {
  313. // TODO Auto-generated catch block
  314. e1.printStackTrace();
  315. }
  316. break;
  317. }
  318. }
  319. }
  320. }
  321. @Override
  322. protected void onDestroy() {
  323. super.onDestroy();
  324. if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.CILENT)
  325. {
  326. shutdownClient();
  327. }
  328. else if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.SERVICE)
  329. {
  330. shutdownServer();
  331. }
  332. BluetoothMsg.isOpen = false;
  333. BluetoothMsg.serviceOrCilent = BluetoothMsg.ServerOrCilent.NONE;
  334. }
  335. }

chat.xml

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?

    >

  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id = "@+id/container"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. >
  8. <RelativeLayout
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:id= "@+id/edit_bottombar"
  12. android:layout_alignParentBottom = "true">
  13. <Button android:id="@+id/btn_disconnect"
  14. android:layout_width="65dp"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentLeft ="true"
  17. android:text="断开"/>
  18. <Button android:id="@+id/btn_msg_send"
  19. android:layout_width="65dp"
  20. android:layout_height="wrap_content"
  21. android:layout_alignParentRight ="true"
  22. android:text="发送"/>
  23. <EditText
  24. android:layout_width="fill_parent"
  25. android:layout_height = "wrap_content"
  26. android:layout_toLeftOf="@id/btn_msg_send"
  27. android:layout_toRightOf="@+id/btn_disconnect"
  28. android:hint = "说点什么呢?"
  29. android:textSize="15dip"
  30. android:id = "@+id/MessageText"/>
  31. </RelativeLayout>
  32. <ListView
  33. android:id="@+id/list"
  34. android:layout_width="fill_parent"
  35. android:layout_height="fill_parent"
  36. android:scrollingCache="false"
  37. android:divider="#ffc6c6c6"
  38. android:layout_weight="1.0"
  39. android:layout_above = "@id/edit_bottombar"
  40. android:layout_below="@id/container"
  41. />
  42. </RelativeLayout>

最后别忘了增加权限

[java] view plaincopy
  1. <uses-permission android:name="android.permission.BLUETOOTH"/>
  2. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
  3. <uses-permission android:name="android.permission.READ_CONTACTS"/>

扩展:蓝牙后台配对实现(网上看到的整理例如以下)

[java] view plaincopy
  1. static public boolean createBond(Class btClass, BluetoothDevice btDevice)
  2. throws Exception {
  3. Method createBondMethod = btClass.getMethod("createBond");
  4. Log.i("life", "createBondMethod = " + createBondMethod.getName());
  5. Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
  6. return returnValue.booleanValue();
  7. }
  8. static public boolean setPin(Class btClass, BluetoothDevice btDevice,
  9. String str) throws Exception {
  10. Boolean returnValue = null;
  11. try {
  12. Method removeBondMethod = btClass.getDeclaredMethod("setPin",
  13. new Class[] { byte[].class });
  14. returnValue = (Boolean) removeBondMethod.invoke(btDevice,
  15. new Object[] { str.getBytes() });
  16. Log.i("life", "returnValue = " + returnValue);
  17. } catch (SecurityException e) {
  18. // throw new RuntimeException(e.getMessage());
  19. e.printStackTrace();
  20. } catch (IllegalArgumentException e) {
  21. // throw new RuntimeException(e.getMessage());
  22. e.printStackTrace();
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. return returnValue;
  28. }
  29. // 取消用户输入
  30. static public boolean cancelPairingUserInput(Class btClass,
  31. BluetoothDevice device) throws Exception {
  32. Method createBondMethod = btClass.getMethod("cancelPairingUserInput");
  33. // cancelBondProcess()
  34. Boolean returnValue = (Boolean) createBondMethod.invoke(device);
  35. Log.i("life", "cancelPairingUserInputreturnValue = " + returnValue);
  36. return returnValue.booleanValue();
  37. }

然后监听蓝牙配对的广播  匹配“android.bluetooth.device.action.PAIRING_REQUEST”这个action
然后调用上面的setPin(mDevice.getClass(), mDevice, "1234"); // 手机和蓝牙採集器配对
createBond(mDevice.getClass(), mDevice);
cancelPairingUserInput(mDevice.getClass(), mDevice);
mDevice是你要去连接的那个蓝牙的对象 , 1234为配对的pin码

转载于:https://www.cnblogs.com/wzzkaifa/p/6814575.html

Android蓝牙通信具体解释相关推荐

  1. Android蓝牙通信

    Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的通信,简单思路就是要手机通过蓝牙发送控制指令给单片机,并作简单的控制应用.单片机的蓝牙模块连接与程序暂且略过,此文主要 ...

  2. Android 蓝牙通信开发

    Android 蓝牙通信开发 Receiver的设置 一.Receiver1(蓝牙状态的改变通过广播接收) 二.Receiver2(蓝牙搜索到设备.绑定设备(配对)通过广播接收) 服务端代码 客户端代 ...

  3. Android 蓝牙通信

    Android 蓝牙通信 一.现在的无线通信方案及差别 二.蓝牙传输功能开发 1.准备阶段 1)权限 2)蓝牙的开启/关闭/状态 判断设备是支持蓝牙 获取蓝牙状态 启动/关闭 2.查找设备 1) 让设 ...

  4. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  5. android 蓝牙通信编程

    http://blog.csdn.net/yudajun/article/details/8362916 公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助. ...

  6. android蓝牙协议名词解释 OPP HFP HDP A2DP PAN

    各种蓝牙协议的全称: OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议. HFP:(Hands-free Profile),让蓝牙设备能够控制电话, ...

  7. android 输出字节数组,Android蓝牙通信字节数组的数据类型转换 求教!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 单片机和安卓手机进行蓝牙通信,发送电压数据到手机,恰好每次8位数据(1字节)传给上位机.采用以下代码获得16进制字符输出,以下是蓝牙通信接收并显示数据部分 ...

  8. android蓝牙通信_Flutter通过BasicMessageChannel实现Flutter 与Android iOS 的双向通信

    题记: --不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧. 通过 Flutter 来进行移动应用开发,打包 Android .iOS 双平台应用程序,在调用如相机 ...

  9. android蓝牙通信_使用Arduino构建OLED显示屏与Android手机接口的智能手表

    背景知识视频教程 Arduino 训练营:通过项目学习​viadean.com 通过制作Arduino UNO FM收音机接收器学习Arduino I2C​viadean.com 通过构建实际应用程序 ...

最新文章

  1. 专属程序员的编程日历,终于来了 | 10月书讯
  2. kettle预览点两下才出数_BBG代王 | 7.16直播预览
  3. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
  4. 分享沙龙丨如何打磨一款好产品?
  5. 修改python默认的编码方式
  6. 第50课 书香阁的座位数
  7. Crash的数字表格(HYSBZ-2154)
  8. python十点半游戏代码_十点半游戏完整代码及详细注释.py
  9. 揭秘网络:互联网调查入门 出版发行时间_cqy、cdx、zqsg……啥意思?揭秘QQ上的“00后黑话”...
  10. 2014年读过的那些书
  11. opencv裁剪图像(不规则裁剪)
  12. 倾斜摄影Smart3D建模培训视频 附文档数据下载
  13. 面向对象基础实战——飞机大战
  14. b站视频下载和字幕下载的方法
  15. 团队项目(六)- 事后诸葛亮分析(江山代有才人秃)
  16. NCM转MP3神奇的网页
  17. HashMap的四种同步方式
  18. 计算机软件工作室起名'',游戏工作室起名大全
  19. matlab怎么多重积分,多重积分的MATLAB实现
  20. 单片机笔记十一:华大单片机

热门文章

  1. 设计模式三(工厂方法模式)学习笔记
  2. console对象及js函数
  3. git提交远程报错[rejected] master - master (fetch first)
  4. android 栈溢出 检查,安卓源码编译完成后打包时出现栈溢出,求大家解决
  5. Intel Pin架构
  6. Redis集群之官方集群
  7. FPGA实现CAN接口(SJA1000)
  8. (32)FPGA面试题时序约束
  9. matlab常用的代码,matlab常用代码
  10. debian uefi legacy 区别_电脑硬盘格式有Legacy与UEFI,选择哪一个好?千万别选错了!...