今天讲下一直让我很痛苦的蓝牙0.0。简单写了个小Demo来说下蓝牙扫描。
MVP的架构其实自己也不是很熟悉,自己就简单玩了一下。首先看下需要定义的接口代码:
/**
* Created by Administrator on 2016/10/18.
*/
public interface IDeviceControlPresenter {
/**
* 数据刷新与加载
*/
public void refreshData();
/**
* 扫描设备
*
* @param second
* 扫描的时间/s
*/
public void scanDevice(int second);
/**
* 停止扫描设备
*/
public void stopScanDevice();
}
定义的这几个接口都是今天需要操作的。接下来看下这个接口的实现类: /**
* Created by Administrator on 2016/10/18.
*/
public class DeviceControlPresenter implements IDeviceControlPresenter {
private BluetoothAdapter mBluetoothAdapter;
private Activity mActivity;
private Handler mTimer = new Handler();
public DeviceControlPresenter(Activity activity) {
mActivity = activity;
BluetoothManager bluetoothManager = (BluetoothManager) mActivity.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
}
@Override
public void refreshData() {
((DeviceScanActivity) mActivity).setRefreshing();
}
private int mSecond;
@Override
public void scanDevice(int second) {
mSecond = second * 1000;
if (!mBluetoothAdapter.isEnabled()) {//未打开蓝牙,提示打开
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//mBaseListenerw.goToActivityForResult(enableBtIntent, Constants.REQUEST_BLE_ENABLE);
mActivity.startActivityForResult(enableBtIntent,Constants.REQUEST_BLE_ENABLE);
}
mBluetoothAdapter.startLeScan(mLeScanCallback);
mTimer.postDelayed(new Runnable() {
@Override
public void run() {
((DeviceScanActivity) mActivity).stopScan();
}
}, mSecond);
}
@Override
public void stopScanDevice() {
mBluetoothAdapter.stopLeScan(mLeScanCallback);
((DeviceScanActivity) mActivity).refreshFinish();
}
/**
* 设备扫描成功回调
*/
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
// 必须更新在主线程中,不然列表不会刷新
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
((DeviceScanActivity) mActivity).initDeviceList(device);
}
});
}
};
}
我们可以看到的是虽然是实现了IDeviceControlPresenter接口,但是一些具体的操作比如:
.setRefreshing();<pre name="code" class="java">.stopScan();
.refreshFinish();
.initDeviceList(device);
我们还是定义在Activity中。我们看下扫描设备的Activity的布局,只是简单的SwipeRefreshLayout和ListView.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl_task"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:dividerHeight="1dip"
android:scrollbars="none" />
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
然后我们看下它的具体代码:
/**
* Created by Administrator on 2016/10/18.
*/
public class DeviceScanActivity extends AppCompatActivity {
private SwipeRefreshLayout mSwipeRefreshLayout;
private ListView mDeviceList;
private LeDeviceListAdapter mLeDeviceListAdapter;
private IDeviceControlPresenter mDeviceScanPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_scan);
mDeviceScanPresenter = new DeviceControlPresenter(DeviceScanActivity.this);
initView();
setListener();
}
private void setListener() {
//下拉刷新
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mDeviceScanPresenter.refreshData();
}
});
}
private void initView() {
mDeviceList = (ListView) findViewById(R.id.listview);
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_task);
mLeDeviceListAdapter = new LeDeviceListAdapter(DeviceScanActivity.this);
mDeviceList.setAdapter(mLeDeviceListAdapter);
mSwipeRefreshLayout.setColorSchemeResources(R.color.black, R.color.black, R.color.black, R.color.black);
}
private Handler mHandler = new Handler() {
};
private static int SECOND = 10;
public void setRefreshing() {
// 使用handler解决mSwipeRefreshLayout.setRefreshing(true);无效问题
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
mDeviceScanPresenter.scanDevice(SECOND);
}
}, 500);
}
/**
* 回调
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQUEST_BLE_ENABLE && resultCode == Activity.RESULT_CANCELED) {
finish();
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
public void stopScan() {
mDeviceScanPresenter.stopScanDevice();
}
/**
* 初始化设备列表
*/
public void initDeviceList(BluetoothDevice device) {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
/**
* 刷新完成
*/
public void refreshFinish() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(false);
}
});
}
}
这里还有一个Adapter:
/**
* Created by Administrator on 2016/10/18.
*/
public class LeDeviceListAdapter extends BaseAdapter {
private ArrayList<BluetoothDevice> mLeDevices;
private LayoutInflater mInflator;
public LeDeviceListAdapter(Context context) {
super();
mLeDevices = new ArrayList<BluetoothDevice>();
mInflator = LayoutInflater.from(context);
}
public void addDevice(BluetoothDevice device) {
if (mLeDevices != null && device.getName() != null) {
// if (!mLeDevices.contains(device)) {
// mLeDevices.add(device);
// }
if (mLeDevices != null && device.getName() != null) {
if (!mLeDevices.contains(device) && ((device.getName().contains("wb")) || (device.getName().contains("Wb")))) {
mLeDevices.add(device);
}
}
}
}
public ArrayList<BluetoothDevice> getDevice() {
return mLeDevices;
}
public BluetoothDevice getDevice(int position) {
return mLeDevices.get(position);
}
public void removeDevice(int position) {
mLeDevices.remove(position);
this.notifyDataSetChanged();
}
public void clear() {
mLeDevices.clear();
}
@Override
public int getCount() {
return mLeDevices.size();
}
@Override
public Object getItem(int i) {
return mLeDevices.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@SuppressLint("InflateParams")
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (view == null) {
view = mInflator.inflate(R.layout.item_bluetooth_device, null);
viewHolder = new ViewHolder();
viewHolder.deviceAddress = (TextView) view.findViewById(R.id.tv_device_address);
viewHolder.deviceName = (TextView) view.findViewById(R.id.tv_device_name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
BluetoothDevice device = mLeDevices.get(i);
String deviceName = device.getName();
// try {
// DeviceAlias deviceAlias = DBController.getDeviceAlias(device.getAddress());
// if (deviceAlias != null) {
// deviceName = deviceAlias.getAlias();
// }
// } catch (DbException e) {
// e.printStackTrace();
// }
if (deviceName != null && deviceName.length() > 0)
viewHolder.deviceName.setText(deviceName);
else
viewHolder.deviceName.setText("---");
viewHolder.deviceAddress.setText(device.getAddress());
return view;
}
static class ViewHolder {
TextView deviceName;
TextView deviceAddress;
}
}
这里的item的布局就不贴了。就是简单的两个textView.
简单的就是这样了。由于在家没有设备可以扫,不能给大家看效果。
MVP不是很熟悉,请大家指出不对的地方。
共勉!