博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 蓝牙如何使用
阅读量:4285 次
发布时间:2019-05-27

本文共 8435 字,大约阅读时间需要 28 分钟。

今天面试问我做过蓝牙灯泡没,现在正好看一下,最近智能家居很火

蓝牙就好像一个美女,我要在这个情人节的夜晚,把它衣服一件一件脱光光,嘿嘿

这个代码适配的是4.0,之后的我就不知道是否可行了,我在这只是了解下

1. 原理图

这里写图片描述

2. 蓝牙 API

获取本地蓝牙适配器    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();    打开手机蓝牙    mBluetoothAdapter .enable();    关闭手机蓝牙    mBluetoothAdapter.disable();    扫描蓝牙设备    mBluetoothAdapter.startDiscovery();    取消扫描蓝牙设备,减少资源的消耗    mBluetoothAdapter.cancelDiscovery();

3. 添加蓝牙广播接受者

IntentFilter filter = new IntentFilter();// 开始扫描的广播filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);// 扫描完成的广播filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);// 发现一个可用的设备的广播filter.addAction(BluetoothDevice.ACTION_FOUND);mBluetoothReceiver = new BluetoothReceiver();//注册监听registerReceiver(mBluetoothReceiver, filter);

4. 蓝牙广播接受者

class BluetoothReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        //根绝不同的action做判断,eg:获取蓝牙设备    }}

5. 连接设备

public void connectServer(final BluetoothDevice device) {        new Thread(new Runnable(){            @Override            public void run() {                try {                    System.out.println(randomUUID.toString());                    BluetoothSocket clientSocket = device.                            createRfcommSocketToServiceRecord(                                    UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"));                    clientSocket.connect();                    out = clientSocket.getOutputStream();                    System.out.println("连接成功");                    Looper.prepare();                    Toast.makeText(BluetoothDemoActivity.this, "连接成功", 0).show();                    Looper.loop();                } catch (IOException e) {                    e.printStackTrace();                }            }}).start();    }

6. 注销设备

注销广播接受者    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(mBluetoothReceiver);    }

7. 代码

7.1 Activity

ublic class BlueToothActiity extends AppCompatActivity implements AdapterView.OnItemClickListener {    private ListView mLv;    private BluetoothAdapter mBluetoothAdapter;    private OutputStream mOutputStream;    private ArrayList
mDevices = new ArrayList
(); private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 扫描到蓝牙设备 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDevices.add(device); mAdapter.notifyDataSetChanged(); System.out.println("device name" + device.getName()); } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { Toast.makeText(getApplicationContext(), "开始扫描", Toast.LENGTH_SHORT).show(); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { Toast.makeText(getApplicationContext(), "扫描结束", Toast.LENGTH_SHORT).show(); } } }; private DeviceAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLv = (ListView) findViewById(R.id.lv); mAdapter = new DeviceAdapter(getApplicationContext(), mDevices); mLv.setAdapter(mAdapter); mLv.setOnItemClickListener(this); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // 注册广播接收者, 当扫描到蓝牙设备的时候, 系统会发送广播 IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mBluetoothReceiver, filter); } public void clickBtn(View v) { switch (v.getId()) { case R.id.button1: // 蓝牙是否可用 if (!mBluetoothAdapter.isEnabled()) { // 打开蓝牙 mBluetoothAdapter.enable(); } break; case R.id.button2: // 关闭蓝牙 if (mBluetoothAdapter.isEnabled()) { mBluetoothAdapter.disable(); } break; case R.id.button3: // 开始扫描 mDevices.clear(); mAdapter.notifyDataSetChanged(); mBluetoothAdapter.startDiscovery(); break; case R.id.button4: // 停止扫描 mBluetoothAdapter.cancelDiscovery(); break; case R.id.button5: sendCtrl(0); break; case R.id.button6: sendCtrl(1); break; case R.id.button7: sendCtrl(2); break; default: break; } } private void sendCtrl(int i) { try { byte[] bs = new byte[5]; bs[0] = (byte)0x01; bs[1] = (byte)0x99; if(i== 0) { bs[2] = (byte)0x10; bs[3] = (byte)0x10; }else if(i==1) { bs[2] = (byte)0x11; bs[3] = (byte)0x11; }else if(i==2) { bs[2] = (byte)0x17; bs[3] = (byte)0x17; } bs[4] = (byte)0x99; mOutputStream.write(bs); } catch (IOException e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mBluetoothReceiver); } @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { BluetoothDevice device = mDevices.get(position); conn(device); } private void conn(final BluetoothDevice device) { // 建立蓝牙连接是耗时操作, 类似TCP Socket, 需要放在子线程里 new Thread() { public void run() { try { // 获取 BluetoothSocket, UUID需要和蓝牙服务端保持一致 BluetoothSocket bluetoothSocket = device.createRfcommSocketToServiceRecord(UUID .fromString("00001101-0000-1000-8000-00805F9B34FB")); // 和蓝牙服务端建立连接 bluetoothSocket.connect(); // 获取输出流, 往蓝牙服务端写指令信息 mOutputStream = bluetoothSocket.getOutputStream(); // 提示用户 runOnUiThread(new Runnable() { public void run() { System.out.println("连接成功----"); Toast.makeText(getApplicationContext(), "连接成功", Toast.LENGTH_SHORT) .show(); } }); } catch (IOException e) { e.printStackTrace(); } }; }.start(); }}

7.2 Adapter

public class DeviceAdapter extends BaseAdapter {
private ArrayList
mDevices; private Context mContext; public DeviceAdapter(Context context, ArrayList
devices) { mDevices = devices; mContext = context; } @Override public int getCount() { return mDevices.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null) { convertView = View.inflate(mContext, R.layout.bluetooth_item, null); holder = new ViewHolder(); holder.mTvName = (TextView) convertView.findViewById(R.id.tv_name); holder.mTvAddress = (TextView) convertView.findViewById(R.id.tv_address); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } BluetoothDevice device = mDevices.get(position); holder.mTvName.setText(device.getName()); holder.mTvAddress.setText(device.getAddress()); return convertView; } class ViewHolder { TextView mTvName; TextView mTvAddress; }}

7.3 布局

你可能感兴趣的文章
swift之常用的修饰符、关键字
查看>>
swift之字典转模型kvc、mjextention桥接、反射、HandyJSON、ObjectMapper、Codable
查看>>
swift之判断类型的方法
查看>>
swift之获取APP各种参数和device参数、获取APPstore信息、以及跳转到appstore
查看>>
swift之MBProgressHUD的使用
查看>>
swift 之-下拉刷新框架的使用
查看>>
swift之闭包的使用
查看>>
swift 之懒加载
查看>>
swift之tabBarController
查看>>
swift之navigationController、navigation bar
查看>>
swift之网络下载图片sdwebImage、Kingfisher、Nuke
查看>>
swift之xib的使用、从xib获取view和控制器、storyboard获取控制器
查看>>
swift之字符串名转类名NSClassFromString
查看>>
swift之按钮的使用
查看>>
swif之Tableview的使用、cell动态高度、侧滑删除、设置中心、个人中心、cell多选、cell单选
查看>>
swift之自动布局,系统自带的布局、SnapKit布局
查看>>
swift之自动计算字符串文本大小
查看>>
swift之View向上偏移的解决
查看>>
swift之颜色、16进制颜色转换成RGB颜色
查看>>
swift之UICollectionView的使用、cell多选
查看>>