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

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

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

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

打开蓝牙的两种方式:

第一种:Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,1);

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

第二种:bluetoothAdapter.enable();

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

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

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

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

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

bluetoothAdapter.cancelDiscovery();

}

bluetoothAdapter.startDiscovery();

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

3.创建并注册作,关键代码如下:

@Overridepublic void onReceive(Context arg0, Intent arg1) {// TODO Auto-generated method stubString 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.BluetoothServerSocket来实现的

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

clientSocket=device

.createRfcommSocketToServiceRecord(MY_UUID);

serverSocket=bluetoothAdapter

.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);

这里需要注意的是:

UUIDMY_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 blocke.printStackTrace();}}@Overridepublic 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 blocke.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() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {// TODO Auto-generated method stubString 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 blocke.printStackTrace();}if (null != os) {//向服务器端发送一个字符串try {os.write("这是另一台手机发送过来的数据".getBytes("utf-8"));Toast.makeText(MainActivity.this,"发送成功",1000);} catch (Exception e) {// TODO Auto-generated catch blockToast.makeText(MainActivity.this,"发送失败",1000);e.printStackTrace();}}}}} );

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

源码下载

莫找借口失败,只找理由成功。(不为失败找理由,要为成功找方法

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

相关文章:

你感兴趣的文章:

标签云: