蓝牙是一种支持设备短距离通信的无线电技术。能在包括移动电话,PDA,无线耳机,笔记本电脑等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效的简化移动通信终端设备之间的通信,也能够成功的简化设备与Internet之间的通信,使得数据传输变得更加迅速高效,为无线通信拓宽道路。
Android 2.0 引入蓝牙端口,开发时需要真机测试且硬件支持。
蓝牙的基本设置
//打开蓝牙设备
public void openBlueToothClick(View v){
//第一种方法,打开蓝牙设备(提示对话框)
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
//第二种方法,打开蓝牙,静默打开
// BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
// bluetoothAdapter.enable();
}
public void closeBlueToothClick(View v){
//关闭蓝牙设备
BluetoothAdapter bluetoothAdapter1=BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter1.disable();
}
public void scanClick(View v){
//开始扫描蓝牙设备
BluetoothAdapter bluetoothAdapter2=BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter2.startDiscovery();
Set set=bluetoothAdapter2.getBondedDevices();
for (BluetoothDevice bd : set)
{
System.out.println("name"+bd.getName());
System.out.println("address"+bd.getAddress());
}
}
public void serverClick(View v){
Intent intent=new Intent(this,ServerBluetoothActivity.class);
startActivity(intent);
}
public void clientClick(View v){
Intent intent=new Intent(this,ClientBluetoothActivity.class);
startActivity(intent);
}
}
BluetoothAdapter bluetooth=null;//本地蓝牙设备
BluetoothServerSocket serverSocket=null;//蓝牙设备Socket服务端
BluetoothSocket socket=null;//蓝牙设备Socket客户端
//输入输出流
PrintStream out;
BufferedReader in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server_bluetooth);
setTitle("蓝牙服务端");
textView_content= (TextView) findViewById(R.id.textView_content);
editText_info= (EditText) findViewById(R.id.editText_info);
button_send= (Button) findViewById(R.id.button_send);
init();
}
//创建蓝牙服务器端的Socket
private void init() {
textView_content.setText("服务器已启动,正在等待连接...\n");
new Thread(new Runnable() {
@Override
public void run() {
//1.得到本地设备
bluetooth=BluetoothAdapter.getDefaultAdapter();
//2.创建蓝牙Socket服务器
try
{
serverSocket=bluetooth.listenUsingRfcommWithServiceRecord("text", UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
//3.阻塞等待Socket客户端请求
socket=serverSocket.accept();
if (socket!=null)
{
out=new PrintStream(socket.getOutputStream());
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
handler.sendEmptyMessage(CONN_SUCCESS);
}
catch (IOException e)
{
e.printStackTrace();
Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
handler.sendMessage(msg);
}
}
}).start();
}
//防止内存泄漏 正确的使用方法
private final MyHandler handler = new MyHandler(this);
public class MyHandler extends Handler {
//软引用
WeakReference weakReference;
public MyHandler(ServerBluetoothActivity activity) {
weakReference = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ServerBluetoothActivity activity = weakReference.get();
if (activity != null) {
switch (msg.what) {
case RECEIVER_INFO:
setInfo(msg.obj.toString() + "\n");
break;
case SET_EDITTEXT_NULL:
editText_info.setText("");
break;
case CONN_SUCCESS:
setInfo("连接成功!\n");
button_send.setEnabled(true);
new Thread(new ReceiverInfoThread()).start();
break;
case CONN_FAIL:
setInfo("连接失败!\n");
setInfo(msg.obj.toString() + "\n");
break;
default:
break;
}
}
}
}
private boolean isReceiver=true;
class ReceiverInfoThread implements Runnable {
@Override
public void run() {
String info=null;
while (isReceiver)
{
try {
info=in.readLine();
Message msg=handler.obtainMessage(RECEIVER_INFO,info);
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void sendClick(View v)
{
final String content=editText_info.getText().toString();
if (TextUtils.isEmpty(content))
{
Toast.makeText(ServerBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
out.println(content);
out.flush();
handler.sendEmptyMessage(SET_EDITTEXT_NULL);
}
}).start();
}
private void setInfo(String info)
{
StringBuffer sb=new StringBuffer();
sb.append(textView_content.getText());
sb.append(info);
textView_content.setText(sb);
}
BluetoothAdapter bluetooth=null;//本地蓝牙设备
BluetoothDevice device=null;//远程蓝牙设备
BluetoothSocket socket=null;//蓝牙设备Socket客户端
//输入输出流
PrintStream out;
BufferedReader in;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_bluetooth);
setTitle("蓝牙客户端");
textView_content= (TextView) findViewById(R.id.textView_content);
editText_info= (EditText) findViewById(R.id.editText_info);
button_send= (Button) findViewById(R.id.button_send);
init();
}
//创建蓝牙客户端端的Socket
private void init() {
textView_content.setText("客户端已启动,正在等待连接...\n");
new Thread(new Runnable() {
@Override
public void run() {
//1.得到本地蓝牙设备的默认适配器
bluetooth=BluetoothAdapter.getDefaultAdapter();
//2.通过本地蓝牙设备得到远程蓝牙设备
device=bluetooth.getRemoteDevice("22:22:4E:6E:59:86");
//3.根据UUID创建并返回一个BoluetoothSocket
try {
socket=device.createRfcommSocketToServiceRecord(UUID.fromString("00000000-2527-eef3-ffff-ffffe3160865"));
if (socket!=null)
{
// 连接
socket.connect();
//处理客户端输出流
out=new PrintStream(socket.getOutputStream());
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
handler.sendEmptyMessage(CONN_SUCCESS);
} catch (IOException e) {
e.printStackTrace();
Message msg=handler.obtainMessage(CONN_FAIL,e.getLocalizedMessage());
handler.sendMessage(msg);
}
}
}).start();
}
//防止内存泄漏 正确的使用方法
private final MyHandler handler = new MyHandler(this);
public class MyHandler extends Handler {
//软引用
WeakReference weakReference;
public MyHandler(ClientBluetoothActivity activity) {
weakReference = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ClientBluetoothActivity activity = weakReference.get();
if (activity != null) {
switch (msg.what) {
case RECEIVER_INFO:
setInfo(msg.obj.toString() + "\n");
break;
case SET_EDITTEXT_NULL:
editText_info.setText("");
break;
case CONN_SUCCESS:
setInfo("连接成功!\n");
button_send.setEnabled(true);
System.out.println("name"+device.getName());
System.out.println("Uuids"+device.getUuids());
System.out.println("Address"+device.getAddress());
new Thread(new ReceiverInfoThread()).start();
break;
case CONN_FAIL:
setInfo("连接失败!\n");
setInfo(msg.obj.toString() + "\n");
break;
default:
break;
}
}
}
}
private boolean isReceiver=true;
//接收信息的线程
class ReceiverInfoThread implements Runnable {
@Override
public void run() {
String info=null;
while (isReceiver)
{
try {
System.out.println("--ReceiverInfoThread start --");
info=in.readLine();
System.out.println("--ReceiverInfoThread read --");
Message msg=handler.obtainMessage(RECEIVER_INFO,info);
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void sendClick(View v)
{
final String content=editText_info.getText().toString();
if (TextUtils.isEmpty(content))
{
Toast.makeText(ClientBluetoothActivity.this,"不能发送空消息",Toast.LENGTH_LONG).show();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
out.println(content);
out.flush();
handler.sendEmptyMessage(SET_EDITTEXT_NULL);
}
}).start();
}
private void setInfo(String info)
{
StringBuffer sb=new StringBuffer();
sb.append(textView_content.getText());
sb.append(info);
textView_content.setText(sb);
}
}
服务器端的界面设置