android通过蓝牙实现两台手机传输数据

今天学习了android蓝牙方面的基础知识,包含了打开和关闭蓝牙的操作,以及两部手机之间通过蓝牙实现的数据传输。下面看代码:

首先,需要在清单文件里添加蓝牙操作的权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

打开蓝牙的两种方式:

第一种:Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,1);

这种方式会提示用户是否打开蓝牙

第二种:bluetoothAdapter.enable();

这种方式系统直接打开蓝牙

关闭蓝牙的操作:bluetoothAdapter.disable();

 

搜索附近蓝牙的基本操作:

1.BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//得到默认的蓝牙适配器

 

2.if (bluetoothAdapter.isDiscovering()) {//如果正好在搜索,则先取消搜索

bluetoothAdapter.cancelDiscovery();

}

bluetoothAdapter.startDiscovery();

第二部在搜索的时候,会发出一个广播BluetoothDevice.ACTION_FOUND

3.创建并注册BroadcastReceiver并在onReceive方法中进行操作,关键代码如下:

  @Override
		public void onReceive(Context arg0, Intent arg1) {
			// TODO Auto-generated method stub
			String action = arg1.getAction();
			//获得已经搜索到的蓝牙设备
			if (BluetoothDevice.ACTION_FOUND.equals(action)) {
				BluetoothDevice device = arg1.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
				//搜索到的设备不是已经绑定的设备
				if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
					//将搜索到的新蓝牙设备和名称显示到textview中
					show.append(device.getName()+":"+device.getAddress()+"\n");
					
				}
			}else if (bluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {//说明搜索已经完成
				setProgressBarIndeterminateVisibility(false);
				setTitle("搜索蓝牙设备");
				
			}
		}


2.两个蓝牙设备之间的通信

在清单文件里添加蓝牙操作的权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

A.在两个手机上蓝牙之间传输数据是通过BluetoothSocketBluetoothServerSocket来实现的

B.创建BluetoothSocket和BluetoothServerSocket的方式如下:

clientSocket = device

.createRfcommSocketToServiceRecord(MY_UUID);

serverSocket = bluetoothAdapter

.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);

这里需要注意的是:

 UUID MY_UUID = UUID

.fromString("5dd231bf-d217-4e85-a26c-5e5cfda9aa0c");

5dd231bf-d217-4e85-a26c-5e5cfda9aa0c是有系统提供的UUID.randomUUID().toString();生成的可以用于蓝牙设备之间的传输身份证,这个是唯一的

NAME是一个字符串,是我们随便给的

B.创建接受数据的线程类:

private class AcceptThread extends Thread{
		private BluetoothServerSocket serverSocket;
		private BluetoothSocket socket;
		private InputStream is;
		private OutputStream os;
		public AcceptThread() {
			//创建BluetoothServerSocket对象
			try {
				serverSocket = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("name",UUID.fromString("5dd231bf-d217-4e85-a26c-5e5cfda9aa0c"));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		@Override
		public void run() {
			// TODO Auto-generated method stub
			//等待接受蓝牙客户端的请求
			try {
				socket = serverSocket.accept();
				is = socket.getInputStream();
				os = socket.getOutputStream();
				while(true){
					byte[] buffer = new byte[128];
					int count = is.read(buffer);
					Message message = new Message();
					message.obj = new String(buffer,0, count, "utf-8");
					handler.sendMessage(message);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

}

得到已经绑定的蓝牙设备并用list显示出来

luetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//得到默认的蓝牙适配器
C.Set<BluetoothDevice>paireDevices = bluetoothAdapter.getBondedDevices();//得到已经绑定的蓝牙设备
if (paireDevices.size() > 0) {//若存在
	String []data = new String[paireDevices.size()];
	for (BluetoothDevice bluetoothDevice : paireDevices) {
		data[count++] = bluetoothDevice.getName()+":"+bluetoothDevice.getAddress();//得到绑定蓝牙设备的名称和地址
	}
	adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_expandable_list_item_1,data);
			
list.setAdapter(adapter);


list的每一个列表项绑定监听事件:

list.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				// TODO Auto-generated method stub
				String s = adapter.getItem(position);
				//获得要连接的蓝牙设备的地址
				String address = s.substring(s.indexOf(":")+1).trim();
				if (null == device) {
					//获得蓝牙设备,相当于网路客户端制定的socketip地址
					device = bluetoothAdapter.getRemoteDevice(address);
				}
				if (null == clientSocket) {
					try {
						clientSocket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("5dd231bf-d217-4e85-a26c-5e5cfda9aa0c"));
						//开始连接蓝牙设备
						clientSocket.connect();
						os = clientSocket.getOutputStream();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					if (null != os) {
						//向服务器端发送一个字符串
						try {
							os.write("这是另一台手机发送过来的数据".getBytes("utf-8"));
							Toast.makeText(MainActivity.this,"发送成功",1000);
						} catch (Exception e) {
							// TODO Auto-generated catch block
							Toast.makeText(MainActivity.this,"发送失败",1000);
							e.printStackTrace();
						} 
					}
				}
      }
} );

分别将该应用部署到两部手机,实现蓝牙通信.注意目前这种方式只支持简单的数据传输,如果需要出书二进制文件,比如音频,还是不可以的。

源码下载










Android蓝牙配对传输数据协议Demo是一个示例应用程序,用于演示在Android设备之间进行蓝牙配对传输数据的协议。该Demo应用程序旨在帮助开发人员理解和学习蓝牙配对传输数据的原理和实现方式。 该Demo应用程序包含以下几个主要部分: 1. 设备配对:该部分演示如何在两个Android设备之间建立蓝牙连接并进行配对。用户可以在应用程序中选择要配对的设备,然后触发配对过程。在配对成功后,两台设备将建立蓝牙连接。 2. 数据传输:该部分演示如何在已配对的蓝牙设备之间传输数据。用户可以在应用程序中选择要传输的数据,然后触发数据传输过程。传输的数据可以是文本、图片或其他类型的文件。在数据传输过程中,应用程序将通过蓝牙连接将数据发送到另一台设备。 3. 数据接收:该部分演示如何在已配对的蓝牙设备上接收传输的数据。用户可以在应用程序中查看接收到的数据,并进行相应的处理。接收到的数据可以是文本、图片或其他类型的文件。 通过这个Demo应用程序,开发人员可以学习如何使用Android蓝牙API来实现设备配对和数据传输功能。他们可以了解到蓝牙配对的步骤和过程,以及如何处理传输数据。这个Demo为开发人员提供了一个基础的示例,可以在其基础上进行二次开发和定制,以满足特定应用场景的需求。 总之,Android蓝牙配对传输数据协议Demo是一个有助于学习和理解蓝牙配对传输数据原理和实现方式的示例应用程序。通过该Demo,开发人员可以快速上手并开发出适用于他们应用场景的蓝牙配对传输数据功能。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值