package com.example.bluethooth;
import android.Manifest;
import android.annotation.SuppressLint;
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.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class MainActivityextends AppCompatActivity {
public static final int REQUEST_BT_ENABLE_CODE =200;
public static final StringBT_UUID ="00001101-0000-1000-8000-00805F9B34FB";//uuid
private static final int REQUEST_ENABLE_BT =331;
private Buttonbluetooth;
private BluetoothAdaptermBluetoothAdapter;
private BlueToothStateReceivermReceiver;//广播接收器
private ConnectThreadmConnectThread; //客户端线程
private AcceptThreadmAcceptThread; //服务端线程
private static HandlermHandler =new Handler() {
@Override
public void dispatchMessage(Message msg) {
// mMessageAdapter.addMessage((String) msg.obj);
Log.e("wcm msg:",msg.obj.toString());
}
};
private ListmArrayAdapter;
private ButtonstartBtn;//打开
// private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
// public void onReceive(Context context, Intent intent) {
// String action = intent.getAction();
// // When discovery finds a device
// if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// // Get the BluetoothDevice object from the Intent
// BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// // Add the name and address to an array adapter to show in a ListView
// mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
// }
// }
// };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startBtn =(Button)findViewById(R.id.button2);
startBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAcceptThread==null)
{
mAcceptThread=new AcceptThread();
}
mAcceptThread.start();
}
});
bluetooth = (Button)findViewById(R.id.button);
mArrayAdapter=new ArrayList<>();
mBluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
bluetooth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBluetoothAdapter==null) {
openBT();
}
mBluetoothAdapter.startDiscovery();
}
});
registerRec();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}
private void registerRec() {
//3.注册蓝牙广播
mReceiver =new BlueToothStateReceiver();
IntentFilter filter =new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);//搜多到蓝牙
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索结束
registerReceiver(mReceiver, filter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_ENABLE_BT)
{
if (resultCode==RESULT_OK)
{
openBT();
}
}
}
@SuppressLint("MissingPermission")
private void openBT() {
if (mBluetoothAdapter ==null) {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
//1.设备不支持蓝牙,结束应用
if (mBluetoothAdapter ==null) {
finish();
return;
}
//2.判断蓝牙是否打开
if (!mBluetoothAdapter.enable()) {
//没打开请求打开
Intent btEnable =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(btEnable, REQUEST_BT_ENABLE_CODE);
}
}
class ConnectThreadextends Thread {
private BluetoothDevicemDevice;
private BluetoothSocketmSocket;
private InputStreambtIs;
private OutputStreambtOs;
private boolean canRecv;
private PrintWriterwriter;
public ConnectThread(BluetoothDevice device) {
mDevice = device;
canRecv =true;
}
@Override
public void run() {
if (mDevice !=null) {
try {
//获取套接字
@SuppressLint("MissingPermission") BluetoothSocket temp =mDevice.createInsecureRfcommSocketToServiceRecord(UUID.randomUUID());
//mDevice.createRfcommSocketToServiceRecord(UUID.fromString(BT_UUID));//sdk 2.3以下使用
mSocket = temp;
//发起连接请求
if (mSocket !=null) {
mSocket.connect();
}
sendHandlerMsg("连接 " +mDevice.getName() +"成功!");
//获取输入输出流
btIs =mSocket.getInputStream();
btOs =mSocket.getOutputStream();
//通讯-接收消息
BufferedReader reader =new BufferedReader(new InputStreamReader(btIs, "UTF-8"));
String content =null;
while (canRecv) {
content = reader.readLine();
sendHandlerMsg("收到消息:" + content);
}
}catch (IOException e) {
e.printStackTrace();
sendHandlerMsg("错误:" + e.getMessage());
}finally {
try {
if (mSocket !=null) {
mSocket.close();
}
//btIs.close();//两个输出流都依赖socket,关闭socket即可
//btOs.close();
}catch (IOException e) {
e.printStackTrace();
sendHandlerMsg("错误:" + e.getMessage());
}
}
}
}
private void sendHandlerMsg(String content) {
Message msg =mHandler.obtainMessage();
msg.what =1001;
msg.obj = content;
mHandler.sendMessage(msg);
}
public void write(String msg) {
if (btOs !=null) {
try {
if (writer ==null) {
writer =new PrintWriter(new OutputStreamWriter(btOs, "UTF-8"), true);
}
writer.println(msg);
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
writer.close();
sendHandlerMsg("错误:" + e.getMessage());
}
}
}
}
class BlueToothStateReceiverextends BroadcastReceiver {
@SuppressLint("MissingPermission")
@Override
public void onReceive(Context context, Intent intent) {
// Toast.makeText(MainActivity.this, "触发广播", Toast.LENGTH_SHORT).show();
String action = intent.getAction();
switch (action) {
case BluetoothDevice.ACTION_FOUND:
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Toast.makeText(MainActivity.this, "找到设备" + device.getName(), Toast.LENGTH_SHORT).show();
if (device !=null) {
//找到蓝牙设备
Log.e("wcm","找到蓝牙:");
// Toast.makeText(getApplicationContext(),"蓝牙:"+device.getAddress()+" name:"+device.getName(),Toast.LENGTH_SHORT).show();
}
break;
case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
Log.e("wcm","搜索结束");
// Toast.makeText(getApplicationContext(),"搜索结束",Toast.LENGTH_SHORT).show();
// mMessageAdapter.addMessage("搜索结束");
// mBluetoothAdapter.cancelDiscovery();
break;
}
}
}
class AcceptThreadextends Thread {
private BluetoothServerSocketmServerSocket;
private BluetoothSocketmSocket;
private InputStreambtIs;
private OutputStreambtOs;
private PrintWriterwriter;
private boolean canAccept;
private boolean canRecv;
public AcceptThread() {
canAccept =true;
canRecv =true;
}
@Override
public void run() {
try {
//获取套接字
BluetoothServerSocket temp =mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("TEST_wcm2", UUID.randomUUID());
mServerSocket = temp;
//监听连接请求 -- 作为测试,只允许连接一个设备
if (mServerSocket !=null) {
// while (canAccept) {
mSocket =mServerSocket.accept();
sendHandlerMsg("有客户端连接");
// }
}
//获取输入输出流
btIs =mSocket.getInputStream();
btOs =mSocket.getOutputStream();
//通讯-接收消息
BufferedReader reader =new BufferedReader(new InputStreamReader(btIs, "UTF-8"));
String content =null;
while (canRecv) {
content = reader.readLine();
sendHandlerMsg("收到消息:" + content);
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (mSocket !=null) {
mSocket.close();
}
// btIs.close();//两个输出流都依赖socket,关闭socket即可
// btOs.close();
}catch (IOException e) {
e.printStackTrace();
sendHandlerMsg("错误:" + e.getMessage());
}
}
}
private void sendHandlerMsg(String content) {
Message msg =mHandler.obtainMessage();
msg.what =1001;
msg.obj = content;
mHandler.sendMessage(msg);
}
public void write(String msg) {
if (btOs !=null) {
try {
if (writer ==null) {
writer =new PrintWriter(new OutputStreamWriter(btOs, "UTF-8"), true);
}
writer.println(msg);
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
writer.close();
sendHandlerMsg("错误:" + e.getMessage());
}
}
}
}
}