您的位置:首页 > 移动开发 > Android开发

Android蓝牙连接,传输数据

2016-02-26 21:58 453 查看
本篇文章介绍两部android手机之间如何通过蓝牙传输数据

1 权限声明

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

2  搜索附近的设备

bluetoothAdapter.startDiscovery();
注册广播,从接收到的广播的onReceive的intent参数中获取BluetoothDevice对象
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
注册广播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(receive, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(receive, filter);
3 发送消息
根据对方MAC地址获取对方蓝牙设备
device = bluetoothAdapter.getRemoteDevice(address);
根据设备获取socket
bluetoothSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
建立连接
bluetoothSocket.connect();
获取输出流对象
os = bluetoothSocket.getOutputStream();
往输出流写入想要发送的东西
os.write("Hwllo World".getBytes("utf-8"));
4在接收端获取数据
接收端获得 socket
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
从输入socket中获得输入流
socket = serverSocket.accept();
is = socket.getInputStream();


package com.example.huanghanqing.bluetoothsocket;

import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

Button btnsearch, stopsearch;
BluetoothAdapter bluetoothAdapter = null;
private List<String> bluetoothDevice = new ArrayList<String>();
private ArrayAdapter<String> adapter;
private ListView listView;
private final UUID MY_UUID = UUID
.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
private BluetoothDevice device;
private BluetoothSocket bluetoothSocket;
private OutputStream os;
private final String NAME = "Bluetooth_Socket";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairdDevice = bluetoothAdapter.getBondedDevices();
if (pairdDevice.size() > 0) {
for (BluetoothDevice device : pairdDevice
) {
bluetoothDevice.add(device.getName() + ":" + device.getAddress() + "\n");
}
}

listView = (ListView) findViewById(R.id.listview);
btnsearch = (Button) findViewById(R.id.btn_search);
stopsearch = (Button) findViewById(R.id.btn_stop_search);
btnsearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

searchDevice();
}
});
stopsearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bluetoothAdapter.cancelDiscovery();
setTitle("搜索已经停止");
}
});

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, bluetoothDevice);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); this.registerReceiver(receive, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); this.registerReceiver(receive, filter);

new AcceptThread().start();
}

public void searchDevice() {
setProgressBarIndeterminateVisibility(true);
setTitle("正在扫描...");
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();
}
bluetoothAdapter.startDiscovery();
}

private BroadcastReceiver receive = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// String action = getIntent().getAction(); this is a mistake make by me ,getIntent means get the intent form the activiy who atart this activity
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {

BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
bluetoothDevice.add(device.getName() + ":" + device.getAddress() + "\n");
adapter.notifyDataSetChanged();
}
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
setProgressBarVisibility(false);
setTitle("已搜索完成");
}
}
};

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String s = adapter.getItem(position);
String address = s.substring(s.indexOf(":") + 1).trim();
try {
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();
}
try {
if (device == null) {
device = bluetoothAdapter.getRemoteDevice(address);
}
if (bluetoothSocket == null) {

bluetoothSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
bluetoothSocket.connect();
os = bluetoothSocket.getOutputStream();
}
} catch (Exception e) {
e.printStackTrace();
}
if (os != null) {
os.write("Hwllo World".getBytes("utf-8"));
}
}catch (Exception e){
e.printStackTrace();
}
}

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
Toast.makeText(MainActivity.this, String.valueOf(msg.obj),
Toast.LENGTH_LONG).show();
super.handleMessage(msg);
}
};

private class AcceptThread extends Thread {
private BluetoothServerSocket serverSocket;
private BluetoothSocket socket;
private InputStream is;
private OutputStream os;

public AcceptThread() {
try {
serverSocket = bluetoothAdapter
.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (Exception e) {
// TODO: handle exception
}
}

public void run() {
try {
socket = serverSocket.accept(); is = socket.getInputStream();
os = socket.getOutputStream();

while (true) {
byte[] buffer = new byte[128];
int count = is.read(buffer);
Message msg = new Message();
msg.obj = new String(buffer, 0, count, "utf-8");
handler.sendMessage(msg);
}
} catch (Exception e) {
// TODO: handle exception
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: