1.嗯有段时间没更新博客啦,给广大优快云友上点干活
2.android蓝牙即智能穿戴设备火起来之后蓝牙的普及也是有点猛,今天我们博客的主题就是围绕arduino开发蓝牙控制小车写的测试demo,连接的蓝牙模块是HC-08,06型号,所以出厂的硬件UUID是厂商提供的,增对该demo用的范围也是有限的,当前蓝牙的开发功能和库的使用基本都是一样的,不一样的只是硬件蓝牙模块的UUID,假如想做智能手环什么的换成手环的蓝牙UUID就可以用,嗯,就是这么简单
3.下面先上个gif图爽爽看看效果先,本人基本都是先看效果再决定是否下载该demo
由于我的网络不是很好用的远程投屏至电脑才录制的gif所以看起来搜索蓝牙有点卡,实际效果是不卡的,中间出现的警告框是楼主的手机后台内存只有600+M所以有一个实时监测手机内存的,防止内存不足demo崩了,嗯,个人感觉还是不错的
4.下面上主要代码截图:MainActivity
package com.example.androidbluetooch;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import com.baoyz.swipemenulistview.SwipeMenu;
import com.baoyz.swipemenulistview.SwipeMenuCreator;
import com.baoyz.swipemenulistview.SwipeMenuItem;
import com.baoyz.swipemenulistview.SwipeMenuListView;
import com.baoyz.swipemenulistview.SwipeMenuListView.OnMenuItemClickListener;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Dialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity implements OnClickListener, OnItemClickListener {
protected static final String TAG = "MainActivity";
// 扫描、断开、发送蓝牙button
private Button btn_scan_device, btn_disconnect, btn_send;
// 未配对蓝牙的listview
private ListView lv_disconnect, listview_msgxianshi;
// 已配对蓝牙的listview,自定义的listview带滑动删除
private SwipeMenuListView lv_connect;
// 输入数据的edittext
private EditText ed_inout;
private int REQUEST_ENABLE_BT = 1;
private List<String> list = new ArrayList<String>();
private ConnectThread mConnectThread;
public ConnectedThread mConnectedThread;
private Dialog progressDialog;
private TextView msg;
// 蓝牙适配器
private BluetoothAdapter mBluetoothAdapter;
// 已经配对的蓝牙ArrayList
private ArrayList<BluetoothDevice> data_connect = new ArrayList<BluetoothDevice>();
// 未配对的蓝牙ArrayList
private ArrayList<BluetoothDevice> data_disconnect = new ArrayList<BluetoothDevice>();
// 自定义的adapater,已经配对的蓝牙,未配对的蓝牙
private LeDeviceListAdapter connectListAdapter, disconnectListAdapter;
// HC-08蓝牙连接状态
private boolean mConnected = false;
// HC-06蓝牙连接状态
private boolean mhc06Connected = false;
// 连接成功的蓝牙名字
private String connect_string;
// 未配对的HC-06,08点击的标记位
private int data_onitemclick, datahc06_onitemclick;
// HC-06:判断是已经配对的蓝牙还是未配对的蓝牙,断开连接的视图更新
private boolean disconnect_flag = false;
// HC-08蓝牙地址
private String mDeviceAddress;
// 蓝牙设备
private BluetoothDevice dataconnectBean;
// 蓝牙service,负责后台的蓝牙服务
private static BluetoothLeService mBluetoothLeService;
// 蓝牙的连接状态
private String status = "disconnected";
// 蓝牙特征值
private static BluetoothGattCharacteristic target_chara = null;
private ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();
// 蓝牙4.0的UUID,其中0000ffe1-0000-1000-8000-00805f9b34fb是广州汇承信息科技有限公司08蓝牙模块的UUID
public static String HEART_RATE_MEASUREMENT = "0000ffe1-0000-1000-8000-00805f9b34fb";
// HC-06蓝牙UUID
private static final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
private List<Integer> mBuffer = new ArrayList<Integer>();
private List<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();
private ChatMsgViewAdapter mAdapter;
private SelfDialog selfDialog;
private Handler mhandler = new Handler();
private Handler myHandler = new Handler() {
// 2.重写消息处理函数
public void handleMessage(Message msg) {
switch (msg.what) {
// 判断发送的消息
case 1: {
// 更新View
if (mConnected == true) {
String state = msg.getData().getString("connect_state");
setTitle(connect_string + ":" + state);
} else {
String state = msg.getData().getString("connect_state");
setTitle(state);
}
break;
}
case 2: {
// 更新View
if (mhc06Connected == true) {
String state = msg.getData().getString("connect_state");
setTitle(connect_string + ":" + state);
data_connect.add(data_disconnect.get(datahc06_onitemclick));
data_disconnect.remove(datahc06_onitemclick);
disconnectListAdapter = new LeDeviceListAdapter(MainActivity.this, data_disconnect);
// 为listview指定适配器
lv_disconnect.setAdapter(disconnectListAdapter);
disconnectListAdapter.notifyDataSetChanged();
connectListAdapter = new LeDeviceListAdapter(MainActivity.this, data_connect);
// 为listview指定适配器
lv_connect.setAdapter(connectListAdapter);
connectListAdapter.notifyDataSetChanged();
} else {
String state = msg.getData().getString("connect_state");
setTitle(state);
}
break;
}
case 3: {
// 更新View
if (mhc06Connected == true) {
String state = msg.getData().getString("connect_state");
setTitle(connect_string + ":" + state);
} else {
String state = msg.getData().getString("connect_state");
setTitle(state);
}
break;
}
case 4: {
String state = msg.getData().getString("updata_msg");
listview_msg_stringReceiver(new String(state));
break;
}
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_scan_device = (Button) findViewById(R.id.btn_scandevice);
btn_disconnect = (Button) findViewById(R.id.btn_disconnectdevice);
ed_inout = (EditText) findViewById(R.id.ed_inout);
btn_send = (Button) findViewById(R.id.btn_send);
lv_connect = (SwipeMenuListView) findViewById(R.id.lv_connect);
lv_disconnect = (ListView) findViewById(R.id.lv_disconnect);
listview_msgxianshi = (ListView) find