一、例程简介
1、应用界面图(主界面、设置界面)
2、实现功能:
(1)打开应用,显示主界面,检测蓝牙功能是否打开,否则询问打开;
(2)打开蓝牙功能后,点击“连接设备:”下的按钮选择已匹配的蓝牙设备进行连接;
(3)若蓝牙设备未匹配,可点击旁边的 […] 按钮打开系统蓝牙设置界面,进行蓝牙匹配;
(4)点击中央的上、下、左、右和中间按钮,可发送不同的蓝牙字符串消息;
(5)蓝牙消息内容可通过点击 [设置] 按钮在设置界面中设置,设置的数据重启应用后依然有效;
(6)其中,中间按钮具有长按按下、长按释放和点击三种不同效果;
(7)本应用还附带来电监听功能,有来电时,会自动发送蓝牙消息;
(8)点击 [退出] 按钮,关闭蓝牙连接,并且关闭安卓设备蓝牙功能。
二、工程目录
三、主界面代码
MainActivity.java
package com.example.z.buletoothdemo;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
public final static String TAG = "MainActivity";
private Button bdevice;
private EditText emessage;
private Button btmid;
private BluetoothAdapter ba;
private ArrayList<String> lname = new ArrayList<>();
private ArrayList<String> laddress = new ArrayList<>();
private String sdname;
private String sdaddress;
private BluetoothSocket bsocket = null;
private OutputStream ostream = null;
private InputStream istream = null;
private static final UUID SerialPort_UUID = UUID.fromString(
"00001101-0000-1000-8000-00805F9B34FB");
private Handler hd;
private ReceiveThread rt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bdevice = (Button) findViewById(R.id.btn_dev_name);
emessage = (EditText) findViewById(R.id.et_message);
btmid = (Button)findViewById(R.id.btn_mid);
btmid.setOnTouchListener(new MidOnTouchListener());
ba = BluetoothAdapter.getDefaultAdapter();
hd = new Handler() {
public void handleMessage(Message msg)
{
super.handleMessage(msg);
if(msg.what == 111) {
SharedPreferences preferences = getSharedPreferences(
"messages", MODE_PRIVATE);
String ms = preferences.getString("msg_mlg", "5");
SendStr(ms);
}else if(msg.what == 112) {
emessage.setText(Arrays.toString((byte[])msg.obj));
emessage.setEnabled(true);
}
}
};
// When "Device does not support Bluetooth"
if (ba == null) {
Toast.makeText(getApplicationContext(),
getResources().getString(R.string.dev_nsup_bt),
Toast.LENGTH_SHORT).show();
}
// When Bluetooth hasn't opened, enable it
if (!ba.isEnabled()) {
Intent turnOn = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOn, 0);
}
}
// Function to send Bluetooth message
public void SendStr(String str) {
byte[] bf = new byte[33];
bf = str.getBytes();
if((!str.equals("")) && (bsocket!=null)) {
try {
ostream = bsocket.getOutputStream();
ostream.write(bf);
ostream.write('\0'); // Send an ending sign
} catch (IOException e) {
e.printStackTrace();
}
try {
if (ostream != null) {
ostream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
emessage.setText("");
}
}
// Thread to receive Bluetooth message
public class ReceiveThread extends Thread {
BluetoothSocket tsocket;
public ReceiveThread(BluetoothSocket socket) {
this.tsocket = socket;
InputStream tistream = null;
try {
tistream = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
istream = tistream;
}
@Override
public void run() {
byte[] buffer = new byte[32];
String str;
// Keep on receiving
while (true) {
try {
istream.read(buffer);
str = new String(buffer,"UTF-8");
buffer = new byte[32];
Message msg = hd.obtainMessage(112,str);
hd.sendMessage(msg);
} catch (IOException e) {
try {
if (istream != null) {
istream.close();
}
break;
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// Listener to catch the RINGING STATE
class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.i(TAG, "in coming number:" + incomingNumber);
if(state == TelephonyManager.CALL_STATE_RINGING) {
SharedPreferences preferences = getSharedPreferences(