android实现蓝牙app代码

作者:tangzheng828 时间:2021-07-08 07:52:15 

本文实例为大家分享了android实现蓝牙app的具体代码,供大家参考,具体内容如下


private BluetoothGatt bluetoothGatt;
private BluetoothGattService gattService;
private BluetoothGattCharacteristic gattCharacteristic;
private BluetoothManager bluetoothManager;
private BluetoothAdapter bluetoothAdapter;
private List<BluetoothDevice> devices = new ArrayList<>();

private UUID serviceUUID;  //不同设备 不同uuid
private UUID characteristicUUID;   //不同设备 不同uuid
private final UUID service4UUID= UUID.fromString("0000fff0-0000-1000-8000-00805f9b34fb");  
private final UUID charAUUID = UUID.fromString("0000fffa-0000-1000-8000-00805f9b34fb");

private LightReceiver lightReceiver;
private ScanReceiver scanReceiver;
private ListView listView;
private TextView tvrefresh;
private String lightAction;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Log.i("tag", "MainActivity  onCreate()");
 //
 listView = (ListView) findViewById(R.id.lv_bluetooth);
 tvrefresh = (TextView) findViewById(R.id.tv_refresh_bluetooth);
 tvrefresh.setOnClickListener(this);
 openBluetooth();
 registeLigthReceiver();
 registeScanReceiver();

}

@Override
protected void onStart() {
 super.onStart();
 Log.i("tag", "MainActivity  onStart()");
 bluetoothScan();
}

//返回
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
 Log.i("tag", "MainActivity  onKeyUp()");
 this.finish();
 return super.onKeyUp(keyCode, event);
}

//重新扫描蓝牙
@Override
public void onClick(View view) {
 switch (view.getId()) {
   case R.id.tv_refresh_bluetooth:
     //蓝牙扫描
     bluetoothScan();
     break;
   default:
     break;
 }
}

//打开本地蓝牙
private void openBluetooth() {
 Log.i("tag", "openLocalBluetooth()");
 //检查手机是否支持蓝牙4.0
 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
   Toast.makeText(this, "手机不支持蓝牙4.0", Toast.LENGTH_SHORT).show();
   finish();
 }
 //调用系统服务的方式,请求开启蓝牙
 bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
 bluetoothAdapter = bluetoothManager.getAdapter();
 //开启蓝牙
 if (!bluetoothAdapter.isEnabled()) {
   bluetoothAdapter.enable();
 }
}

//开始蓝牙扫描  扫描到一个添加一个
private void bluetoothScan() {
 Log.i("tag", "bluetoothScan()");
 if (bluetoothAdapter == null) {
   openBluetooth();
 }
 if (!bluetoothAdapter.isDiscovering()) {
   bluetoothAdapter.startDiscovery();  //回调
 } else {
   Toast.makeText(this, "扫描中..", Toast.LENGTH_SHORT).show();
 }
}

//更新蓝牙列表中的数据
private void updateUi() {
 Log.i("tag", "updateUi()");
 if (devices != null && devices.size() > 0) {
   BlueAdapter adapter = new BlueAdapter(this, devices);
   listView.setAdapter(adapter);
   adapter.notifyDataSetChanged();
 } else {
   Toast.makeText(this, "附近没有蓝牙", Toast.LENGTH_SHORT).show();
 }
}

//取得gatt 对应的service
private BluetoothGattService getGattService(BluetoothGatt gatt, UUID serviceUUID) {
 List<BluetoothGattService> gattServices = gatt.getServices();
 for (BluetoothGattService gattService : gattServices) {
   if (gattService.getUuid().equals(serviceUUID)) {
     return gattService;
   }
 }
 return null;
}

//取得service对应的characteristic
private BluetoothGattCharacteristic getGattCharacteristic(BluetoothGattService gattService, UUID characteristicUUID) {
 List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
 for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
   if (gattCharacteristic.getUuid().equals(characteristicUUID)) {
     return gattCharacteristic;
   }
 }
 return null;
}

//注册蓝牙扫描监听
private void registeScanReceiver() {
 Log.i("tag", "registeScanReceiver()");
 scanReceiver = new ScanReceiver();
 IntentFilter filter = new IntentFilter();
 filter.addAction(BluetoothDevice.ACTION_FOUND);
 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
 registerReceiver(scanReceiver, filter);
}

//定义蓝牙扫描监听类 添加device , 更新界面
class ScanReceiver extends BroadcastReceiver {

@Override
 public void onReceive(Context context, Intent intent) {
   Log.i("tag", " BluetoothReceiver / ScanReceiver onReceive()  action=" + intent.getAction());
   String scanAction = intent.getAction();
   if (scanAction.equals(BluetoothDevice.ACTION_FOUND)) {
     BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
     if (!devices.contains(device)) {
       devices.add(device);
       if (CacheUtils.getBlueDeviceString(MainActivity1.this, device.getAddress()).equals("")) {
         CacheUtils.putBlueDeviceString(MainActivity1.this, device.getAddress(), device.getName());
       }
       updateUi();
     }
   } else if (scanAction.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
     if (devices == null || devices.size() == 0) {
       Toast.makeText(MainActivity1.this, "附近没有发现蓝牙设备", Toast.LENGTH_SHORT).show();
     }
   }
 }
}

//注册灯光监听
private void registeLigthReceiver() {
 Log.i("tag", "registeReceiver()");
 lightReceiver = new LightReceiver();
 IntentFilter filter = new IntentFilter();
 filter.addAction("openLight");
 filter.addAction("closeLight");
 registerReceiver(lightReceiver, filter);
}

//定义灯控监听类
class LightReceiver extends BroadcastReceiver {

@Override
 public void onReceive(Context context, Intent intent) {

Log.i("tag", " BluetoothReceiver  /LightReceiver onReceive()  action=" + intent.getAction());
   //
   String address = intent.getStringExtra("bluetoothAddress");  //从adapter取得的数据
   lightAction = intent.getAction();
   // if()   不同设备  不同serviceUUID,不同的characteristicUUID 自己确定
   serviceUUID=service4UUID;
   characteristicUUID=charAUUID;

if (bluetoothAdapter == null) {
     openBluetooth();
   }
   BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address);  
   MyBluetoothGattCallback gattCallback = new MyBluetoothGattCallback();
   bluetoothGatt = device.connectGatt(MainActivity1.this, false, gattCallback);  //回调

}
}

//蓝牙连接/通信回调
class MyBluetoothGattCallback extends android.bluetooth.BluetoothGattCallback {
 @Override
 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
   super.onConnectionStateChange(gatt, status, newState);
   Log.i("tag", "MyBluetoothGattCallback  onConnectionStateChange()  newState=" + newState);
   if (newState == BluetoothProfile.STATE_CONNECTED) {
     gatt.discoverServices();       //连接成功,开始搜索服务,一定要调用此方法,否则获取不到服务
     Log.i("tag", "MyBluetoothGattCallback  STATE_CONNECTED  ");
   } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
     Log.i("tag", "MyBluetoothGattCallback  STATE_DISCONNECTED");
   }
 }

@Override
 public void onServicesDiscovered(BluetoothGatt gatt, int status) {
   super.onServicesDiscovered(gatt, status);
   Log.i("tag", "MyBluetoothGattCallback  onServicesDiscovered() status=" + status);

if (lightAction.equals("openLight") || lightAction.equals("closeLight")) {  //避免 不停更新
     if (gattService == null || gattCharacteristic == null || !serviceUUID.equals(service4UUID) || !characteristicUUID.equals(charAUUID)) {
       gattService = getGattService(gatt, serviceUUID);
       if (gattService != null) {
         gattCharacteristic = getGattCharacteristic(gattService, characteristicUUID);
         if (gattCharacteristic != null) {
           gatt.setCharacteristicNotification(gattCharacteristic, true);
           gatt.connect();
         }
       }
     }
     if (lightAction.equals("openLight")) {
       gattCharacteristic.setValue("openLight"); //这里自己设置 蓝牙模组需要的数据
       gatt.writeCharacteristic(gattCharacteristic);
     } else if (lightAction.equals("closeLight")) {
       gattCharacteristic.setValue("closeLight"); //这里自己设置 蓝牙模组需要的数据
       gatt.writeCharacteristic(gattCharacteristic);
     }
     lightAction = "";
     gatt.readRemoteRssi();
   }
 }
}

@Override
protected void onDestroy() {
 super.onDestroy();
 Log.i("tag", "onDestroy()");
 if (bluetoothAdapter != null) {
   bluetoothAdapter.disable();
   bluetoothAdapter = null;
 }
 if (bluetoothGatt != null) {
   bluetoothGatt.disconnect();
   bluetoothGatt.close();
   bluetoothGatt = null;
 }

if (lightReceiver != null) {
   unregisterReceiver(lightReceiver);
   lightReceiver = null;
 }
 if (scanReceiver != null) {
   unregisterReceiver(scanReceiver);
   scanReceiver = null;
 }
}

来源:https://blog.csdn.net/tangzheng828/article/details/52672345

标签:android,蓝牙,app
0
投稿

猜你喜欢

  • 通俗讲解JVM的类加载机制

    2023-01-03 03:35:03
  • Java分布式事务管理框架之Seata

    2023-09-28 11:50:36
  • Java如何跳过https的ssl证书验证详解

    2023-08-24 11:34:56
  • SpringCloud Edgware.SR3版本中Ribbon的timeout设置方法

    2023-03-07 10:45:46
  • Java编程探索之泛型擦除实例解析

    2022-08-30 02:13:35
  • Android运用onTouchEvent自定义滑动布局

    2021-09-24 04:39:06
  • JAVA实现心跳检测(长连接)

    2022-12-16 04:26:30
  • Mybatis之association和collection用法

    2021-10-13 10:09:10
  • Android编程中出现The connection to adb is down问题的解决方法

    2022-06-27 17:46:07
  • Android实现通用筛选栏

    2021-10-16 05:31:42
  • Java实现布隆过滤器的方法步骤

    2023-02-15 20:31:47
  • Java数据结构学习之栈和队列

    2022-02-21 11:32:45
  • Unity游戏开发之2048游戏的实现

    2023-04-19 00:11:33
  • 浅谈Java编程之if-else的优化技巧总结

    2023-06-02 23:28:12
  • Flutter 分页功能表格控件详细解析

    2023-09-22 20:02:45
  • C#反射在实际应用中的实例代码

    2022-11-25 05:06:21
  • C# 字符串、数组和List的截取和转换实例

    2022-12-16 23:06:38
  • Java将字符串转化为数组的两种方法

    2021-07-07 20:33:49
  • C#逆变与协变详解

    2021-10-25 08:07:54
  • Android WebView 不支持 H5 input type="file" 解决方法

    2022-08-30 21:07:08
  • asp之家 软件编程 m.aspxhome.com