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.在两个手机上蓝牙之间传输数据是通过BluetoothSocket和BluetoothServerSocket来实现的

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();
						}
					}
				}
      }
} );

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

源码下载

时间: 2024-10-27 07:09:59

android通过蓝牙实现两台手机传输数据的相关文章

Android开发之实现两个手机之间的通讯

欢迎转载,转载请注明出处:http://blog.csdn.net/dmk877/article/details/51685656 Hello,大家好,今天又来写博客了,项目终于搞完了最近又有时间写写博客了.在上上篇博客中我们学习了Android中网络通讯,并用Socket实现了Android客户端与服务器的通讯,那么这一篇将进一步来完善这一功能,就是要实现两个android手机端的通讯. 如有谬误,欢迎批评指正,如有疑问欢迎留言 通过本篇博客你将学到以下知识点 ①Socket的用法 ②如何实现

android开发中,两个按下手机实体返回键,两个Activity反复来回跳转的问题

android开发中,对于用intent实现跳转的Ativity,有时候按下手机的返回键时,两个Activity之间会多次相互跳转,始终退出不了程序的情况.这是由于从Activity  A跳转到Activity  B时,A被压入Activity栈中:当从B返回时,默认又重新创建了一个Activity A对象,这样一来就有了多个Activity A对象.所以造成了无法退出情况. 解决办法是:在AndroidManifest.xml文件中找到Activity A项,在其属性中加入  android:

Android bluetooth介绍(两): android 蓝牙源架构和uart 至rfcomm过程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本号:基于android4.2先前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者.请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!! Android bluetooth介绍(一):基本概念及硬件接口Android bluetooth介绍(二): android 蓝牙代码架构及其uart

两台电脑之间怎么用一根网线传输数据

两台电脑之间怎么用一根网线传输数据 此方法在同一个wifi下也行,同一个局域网用wifi传数据 没有网络,两台电脑之间怎么用一根网线传输数据呢? 建议:设置之前,如果联网的话,将ip地址和dns拍下来,等着传输完毕再输入进去. 前提:将两台电脑用一根普通的网线连接 下面以两台电脑都是windows7为例. 如果不是一个系统,请使用飞鸽传书. 工具/原料 两台电脑 一根普通网线 步骤1:设置两台电脑的局域网ip地址 1 为了区分电脑1和2,电脑桌面中,电脑1是蓝色的,电脑2是动态变化的. 设置电脑

Android Bluetooth Low Energy(Android低功耗蓝牙)

Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的API,应用程序通过这些api可以扫描设备.查询services,读写设备的characteristics(属性特征).对比传统的蓝牙,BLE的设计能够显著减低功耗.这让Android应用程序与BLE设备之间的低功耗通讯成为可能,例如距离传感器.心率监视器.健身设备等等. 1.关键术语和概念 1.1 下面是一些BLE关键术语和概念的摘要: * Gener

android平台蓝牙编程

Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样利用android平台提供的蓝牙API去实现蓝牙设备之间的通信,蓝牙设备之间的通信主要包括了四个步骤:设置蓝牙设备.寻找局域网内可能或者匹配的设备.连接设备和设备之间的数据传输.以下是建立蓝牙连接的所需要的一些基本类: BluetoothAdapter类:代表了一个本地的蓝牙适配器.他是所有蓝牙交互的的入口点.利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个Bl

Android 低功耗蓝牙BLE 开发注意事项

基本概念和问题 1.蓝牙设计范式? 当手机通过扫描低功耗蓝牙设备并连接上后,手机与蓝牙设备构成了客户端-服务端架构.手机通过连接蓝牙设备,可以读取蓝牙设备上的信息.手机就是客户端,蓝牙设备是服务端. 手机做为客户端可以连接多个蓝牙设备,所以手机又可以叫中心设备(Central),蓝牙设备叫外围设备(Peripheral). 还有另外一个称谓:手机叫主设备(Master),蓝牙设备叫从设备(Slave). Android4.3 开始支持低功耗蓝牙,此版本只支持单模式:同时只能工作在中心设备模式或者

【源代码】基于Android和蓝牙的单片机温度採集系统

如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 STC89C52单片机通过HC-06蓝牙模块与Android手机通信实例- 基于Android和蓝牙的单片机温度採集系统 整个project下载:http://download.csdn.net/detail/itas109/7539057 当中包含. 1.下位机电路原理图 2.下位机採集温度.控制发送.自己主动纠错代码 3.Android端接收温度并显示代码 文件截图 这个是我当年

Android 实现蓝牙客户端与服务器端通信

一.首先说明:蓝牙通信必须用手机测试,因为avd里没有相关的硬件,会报错! 好了,看看最后的效果图: 二.概述: 1.判断是否支持Bluetooth BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothAdapter == null) { //the device doesn't support bluetooth } else { //the device support b