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;
java.util.UUID import;
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; // broadcast receiver
private ConnectThreadmConnectThread; // client thread
private AcceptThreadmAcceptThread; // server thread
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; // Open
// 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. Registration Bluetooth radio
mReceiver =new BlueToothStateReceiver();
IntentFilter filter =new IntentFilter();
filter.addAction (BluetoothDevice.ACTION_FOUND); // search more to Bluetooth
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. The device does not support Bluetooth, the end of the application
if (mBluetoothAdapter ==null) {
finish();
return;
}
// 2. Bluetooth determine whether to open
if (!mBluetoothAdapter.enable()) {
// request to open not open
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 {
// get socket
@SuppressLint("MissingPermission") BluetoothSocket temp =mDevice.createInsecureRfcommSocketToServiceRecord(UUID.randomUUID());
Use the following //mDevice.createRfcommSocketToServiceRecord(UUID.fromString(BT_UUID));//sdk 2.3
mSocket = temp;
// sends a connection request
if (mSocket !=null) {
mSocket.connect();
}
sendHandlerMsg ( "connect" + mDevice.getName () + "Success!");
// get the input and output streams
btIs =mSocket.getInputStream();
btOs =mSocket.getOutputStream();
// Communication - receiving messages
BufferedReader reader =new BufferedReader(new InputStreamReader(btIs, "UTF-8"));
String content =null;
while (canRecv) {
content = reader.readLine();
sendHandlerMsg ( "receive the message:" + content);
}
}catch (IOException e) {
e.printStackTrace ();
sendHandlerMsg("错误:" + e.getMessage());
}finally {
try {
if (mSocket !=null) {
mSocket.close();
}
//btIs.close();// two output streams rely socket, the socket is closed to
//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, "triggering broadcasting", 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) {
// find a Bluetooth device
Log.e ( "wcm", "find Bluetooth:");
// Toast.makeText(getApplicationContext(),"蓝牙:"+device.getAddress()+" name:"+device.getName(),Toast.LENGTH_SHORT).show();
}
break;
case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
Log.e ( "wcm", "End Search");
// Toast.makeText (getApplicationContext (), "the search ends", Toast.LENGTH_SHORT) .show ();
// mMessageAdapter.addMessage ( "End Search");
// 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 {
// get socket
BluetoothServerSocket temp =mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("TEST_wcm2", UUID.randomUUID());
mServerSocket = temp;
// listens for connection requests - as a test, only one device is connected
if (mServerSocket !=null) {
// while (canAccept) {
mSocket =mServerSocket.accept();
sendHandlerMsg ( "client connection");
// }
}
// get the input and output streams
btIs =mSocket.getInputStream();
btOs =mSocket.getOutputStream();
// Communication - receiving messages
BufferedReader reader =new BufferedReader(new InputStreamReader(btIs, "UTF-8"));
String content =null;
while (canRecv) {
content = reader.readLine();
sendHandlerMsg ( "receive the message:" + content);
}
}catch (IOException e) {
e.printStackTrace ();
}finally {
try {
if (mSocket !=null) {
mSocket.close();
}
// btIs.close (); // two output streams rely socket, the socket is closed to
// 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());
}
}
}
}
}