From eba3627d9a9d7798287d4b4bee7c2ebdc1db490b Mon Sep 17 00:00:00 2001 From: wenfei Date: Sun, 28 Sep 2025 17:15:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E4=BC=A0=E6=84=9F=E5=99=A8?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + app/libs/blemanager.aar | Bin 0 -> 16382 bytes app/src/main/AndroidManifest.xml | 7 +- .../main/java/com/rehome/dywoa/Contans.java | 1 + .../bleUtil/BlueToothDeviceActivity.java | 420 ++++++++++++++++-- .../dywoa/ui/fragment/HomeFragment.java | 47 ++ app/src/main/res/drawable/btn_pressed_bt.xml | 9 + app/src/main/res/drawable/btn_selector_bt.xml | 10 + .../res/layout/activity_blue_tooth_device.xml | 3 +- app/src/main/res/layout/listitem_device.xml | 134 +++++- 10 files changed, 566 insertions(+), 67 deletions(-) create mode 100644 app/libs/blemanager.aar create mode 100644 app/src/main/res/drawable/btn_pressed_bt.xml create mode 100644 app/src/main/res/drawable/btn_selector_bt.xml diff --git a/app/build.gradle b/app/build.gradle index d861378..d73fd95 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -116,6 +116,8 @@ dependencies { //深信服零信任SDK implementation files('libs/SangforSDK.aar') + //W3蓝牙传感器SDK + implementation files('libs/blemanager.aar') implementation libs.circleimageview //腾讯APP崩溃分析 implementation libs.crashreport diff --git a/app/libs/blemanager.aar b/app/libs/blemanager.aar new file mode 100644 index 0000000000000000000000000000000000000000..2464e93cec1a7e07ced1c47770542dbf0244f4e2 GIT binary patch literal 16382 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 LC%O3k=k|XA4^*Wi literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc1c6fe..d587049 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,11 +7,12 @@ android:name="android.hardware.bluetooth_le" android:required="true" /> - + - + diff --git a/app/src/main/java/com/rehome/dywoa/Contans.java b/app/src/main/java/com/rehome/dywoa/Contans.java index 8c7ed44..038f0be 100755 --- a/app/src/main/java/com/rehome/dywoa/Contans.java +++ b/app/src/main/java/com/rehome/dywoa/Contans.java @@ -272,6 +272,7 @@ public class Contans { public final static String LOGIN_TOKEN = "LOGIN_TOKEN"; public final static String NFCBM = "NFCBM"; + public final static String KEY_BLUE_TOOTH = "KEY_BLUE_TOOTH"; public final static String USERNAME = "USERNAME"; public final static String SCID = "scid"; diff --git a/app/src/main/java/com/rehome/dywoa/bleUtil/BlueToothDeviceActivity.java b/app/src/main/java/com/rehome/dywoa/bleUtil/BlueToothDeviceActivity.java index edc656e..458e606 100644 --- a/app/src/main/java/com/rehome/dywoa/bleUtil/BlueToothDeviceActivity.java +++ b/app/src/main/java/com/rehome/dywoa/bleUtil/BlueToothDeviceActivity.java @@ -1,19 +1,27 @@ package com.rehome.dywoa.bleUtil; import android.Manifest; +import android.annotation.SuppressLint; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanResult; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; +import android.graphics.Color; import android.os.Build; -import android.os.Bundle; +import com.bjzc.blemanager.BluetoothLeService; import android.os.Handler; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; import android.widget.ListView; +import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; @@ -23,14 +31,20 @@ import androidx.core.app.ActivityCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.clj.fastble.BleManager; +//import com.clj.fastble.BleManager; +import com.bjzc.blemanager.BleManager; import com.clj.fastble.callback.BleScanCallback; import com.clj.fastble.data.BleDevice; +import com.clj.fastble.data.BleScanState; import com.clj.fastble.scan.BleScanRuleConfig; import com.google.gson.Gson; +import com.rehome.dywoa.Contans; import com.rehome.dywoa.R; +import com.rehome.dywoa.adapter.XzjhAdapter; import com.rehome.dywoa.base.BaseActivity; +import com.rehome.dywoa.utils.SPUtils; import java.util.ArrayList; import java.util.List; @@ -42,6 +56,7 @@ import java.util.List; public class BlueToothDeviceActivity extends BaseActivity { ListView lv; + TextView tx_data; private BluetoothAdapter mBluetoothAdapter; private ArrayList mPermissionList = new ArrayList(); private BluetoothLeScanner bluetoothLeScanner; @@ -54,6 +69,10 @@ public class BlueToothDeviceActivity extends BaseActivity { //private LeDeviceListAdapter leDeviceListAdapter = new LeDeviceListAdapter(); private LeDeviceListAdapter mLeDeviceListAdapter; + private BleManager ble; + private int selectItem = -1; + private String cmd = ""; + @Override public int getContentViewID() { return R.layout.activity_blue_tooth_device; @@ -61,6 +80,84 @@ public class BlueToothDeviceActivity extends BaseActivity { @Override public void initView() { + lv = findViewById(R.id.lv); + tx_data = findViewById(R.id.tx_data); + ble= BleManager.getInstance(); + String str=ble.init(BlueToothDeviceActivity.this); + showLog(str); + + if("BLE is not supported".equals(str)){ + showToast("当前设备不支持低功耗蓝牙,无法连接传感器采集数据"); + } + if("Bluetooth not supported".equals(str)){ + showToast("当前设备不支持蓝牙功能"); + } + if("Bluetooth not enabled".equals(str)){ + showToast("蓝牙功能没有开启"); + } + if("ACCESS_COARSE_LOCATION permission denied".equals(str)){ + showToast("您未授权开启蓝牙扫描附近的设备,请先开启蓝牙权限"); + } + if("context is no Activity".equals(str)){ + showToast("Init(context)方法的参数必须是 Activity"); + } + + ble.setOnReceiveListener(new BleManager.OnReceiveListener() { + @SuppressLint("SetTextI18n") + @Override + public void onShowMessage(Context context, Intent intent) { + final String action = intent.getAction(); + if (BluetoothDevice.ACTION_FOUND.equals(action)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (ActivityCompat.checkSelfPermission(BlueToothDeviceActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return; + } + showLog("扫描发现设备" + device.getName() + "," + device.getAddress()); + String deviceName = device.getName(); + if (deviceName != null && !deviceName.isEmpty()){ + //showLog(new Gson().toJson(device)); + mLeDeviceListAdapter.addDevice(device); + mLeDeviceListAdapter.notifyDataSetChanged(); + } + } else if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { + showLog("连接"); + mLeDeviceListAdapter.setSelectItem(selectItem); + mLeDeviceListAdapter.notifyDataSetChanged(); + + BluetoothDevice device = mLeDeviceListAdapter.getDevice(selectItem); + String deviceName = device.getName(); + if (deviceName != null && !deviceName.isEmpty()){ + SPUtils.put(context, Contans.KEY_BLUE_TOOTH,device.getAddress()); + } + } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { + showLog("断开"); + } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { + showLog("数据传输通道准备就绪,可以发送数据了。"); + } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { + byte[] data= intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA); + String resultReceive = new String(data); + showLog("收到传感器数据" + resultReceive); + if("VR".equals(cmd)){ + showLog(resultReceive); + }else{ + tx_data.setText("接收数值:"+resultReceive); + } + if("0F3101".equals(cmd)){ + ble.write("VR", false); + cmd="VR"; + } + + } + } + }); + initToolbar("蓝牙数据管理", "扫描并确认", new View.OnClickListener() { @Override public void onClick(View v) { @@ -68,14 +165,69 @@ public class BlueToothDeviceActivity extends BaseActivity { mLeDeviceListAdapter.clear(); mLeDeviceListAdapter.notifyDataSetChanged(); //initBlueTooth(); - if(BleManager.getInstance().isSupportBle()){ - initBlueToothFastBle(); +// if(BleManager.getInstance().isSupportBle()){ +// initBlueToothFastBle(); +// }else{ +// showToast("当前设备不支持低功耗蓝牙,无法连接传感器采集数据"); +// } + if("OK".equals(str)){ + ble.scan(); } } }); - BleManager.getInstance().init(getApplication()); - lv = findViewById(R.id.lv); - mLeDeviceListAdapter = new LeDeviceListAdapter(BlueToothDeviceActivity.this); + //BleManager.getInstance().init(getApplication()); + + + + + mLeDeviceListAdapter = new LeDeviceListAdapter(new LeDeviceListAdapter.CallBackBlueToothBind() { + + @Override + public void Click(int position) { + showLog(String.valueOf(position)); + BluetoothDevice device = mLeDeviceListAdapter.getDevice(position); + if (ActivityCompat.checkSelfPermission(BlueToothDeviceActivity.this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return; + } + selectItem=position; + ble.connect(device.getAddress(),device.getName()); + } + }, new LeDeviceListAdapter.CallBackBlueToothUnBind() { + @Override + public void Click(int position) { + + } + }, new LeDeviceListAdapter.CallBackBlueToothSendData() { + @Override + public void Click(int position) { + //ble.write(String cmd, Boolean ishex) + //读固件版本号 + //ble.write("VR", false); + //读电量 + //ble.write("BV", false); + //温度测量 + ble.write("0B0B6300", true); + //距离测量 + //ble.write("4453", true); + //转速测量 + //ble.write("0F3101", true); + //cmd="0F3101"; + //加速度测量 + //ble.write("1F11", true); + //速度测量。 + //ble.write("1F12", true); + //位移测量 + //ble.write("1F13", true); + + } + }); lv.setAdapter(mLeDeviceListAdapter); } @@ -84,6 +236,19 @@ public class BlueToothDeviceActivity extends BaseActivity { } + @Override + protected void onDestroy() { + super.onDestroy(); + ble.scan(); + ble.disconnect(); +// if(BleManager.getInstance().getScanSate()== BleScanState.STATE_SCANNING){ +// BleManager.getInstance().cancelScan(); +// } +// BleManager.getInstance().disconnectAllDevice(); +// BleManager.getInstance().destroy(); + } + + private void initPermission(){ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ // Android 版本大于等于 Android12 时 @@ -135,12 +300,12 @@ public class BlueToothDeviceActivity extends BaseActivity { public void initBlueTooth() { - boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); - if(bluetoothAvailable){ - showLog("传统蓝牙可用"); - }else{ - showLog("传统蓝牙不可用"); - } +// boolean bluetoothAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); +// if(bluetoothAvailable){ +// showLog("传统蓝牙可用"); +// }else{ +// showLog("传统蓝牙不可用"); +// } boolean bluetoothLEAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE); if(bluetoothLEAvailable){ @@ -152,41 +317,65 @@ public class BlueToothDeviceActivity extends BaseActivity { } } - public void initBlueToothFastBle() { - BleManager.getInstance() - .enableLog(true) - .setReConnectCount(1, 5000) - .setSplitWriteNum(20) - .setConnectOverTime(10000) - .setOperateTimeout(5000); +// public void initBlueToothFastBle() { +// if(BleManager.getInstance().getScanSate()== BleScanState.STATE_SCANNING){ +// BleManager.getInstance().cancelScan(); +// } +// BleManager.getInstance() +// .enableLog(true) +// .setReConnectCount(1, 5000) +// .setSplitWriteNum(20) +// .setConnectOverTime(10000) +// .setOperateTimeout(5000); // // BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder() // .setAutoConnect(true) // .setScanTimeOut(10000) // .build(); // BleManager.getInstance().initScanRule(scanRuleConfig); - - BleManager.getInstance().scan(new BleScanCallback() { - @Override - public void onScanStarted(boolean success) { - showToast("开始蓝牙扫描"); - } - - @Override - public void onScanning(BleDevice bleDevice) { - showToast("发现设备"); - mLeDeviceListAdapter.addDevice(bleDevice.getDevice()); - mLeDeviceListAdapter.notifyDataSetChanged(); - } - - @Override - public void onScanFinished(List scanResultList) { - showToast("蓝牙扫描结束"); - showLog(String.valueOf(scanResultList.size())); - showLog(new Gson().toJson(scanResultList)); - } - }); - } +// +// BleManager.getInstance().scan(new BleScanCallback() { +// @Override +// public void onScanStarted(boolean success) { +// showToast("开始蓝牙扫描"); +// } +// +// @Override +// public void onScanning(BleDevice bleDevice) { +//// if (context != null && !BlueToothDeviceActivity.this.isFinishing() && !BlueToothDeviceActivity.this.isDestroyed()) { +//// showToast("发现设备"); +//// } +// BluetoothDevice device = bleDevice.getDevice(); +// if(device!=null){ +// if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { +// // TODO: Consider calling +// // ActivityCompat#requestPermissions +// // here to request the missing permissions, and then overriding +// // public void onRequestPermissionsResult(int requestCode, String[] permissions, +// // int[] grantResults) +// // to handle the case where the user grants the permission. See the documentation +// // for ActivityCompat#requestPermissions for more details. +// return; +// } +// String deviceName = device.getName(); +// if (deviceName != null && !deviceName.isEmpty()){ +// showLog(new Gson().toJson(device)); +// mLeDeviceListAdapter.addDevice(bleDevice.getDevice()); +// mLeDeviceListAdapter.notifyDataSetChanged(); +// } +// } +// } +// +// @Override +// public void onScanFinished(List scanResultList) { +// if (context != null && !BlueToothDeviceActivity.this.isFinishing() && !BlueToothDeviceActivity.this.isDestroyed()) { +// showToast("蓝牙扫描结束"); +// } +// showLog(String.valueOf(mLeDeviceListAdapter.getCount())); +// showLog(new Gson().toJson(scanResultList)); +// } +// }); +// } private void scanLeDevice() { if (!scanning) { @@ -238,4 +427,151 @@ public class BlueToothDeviceActivity extends BaseActivity { } }; + private class LeDeviceListAdapter extends BaseAdapter { + private class ViewHolder { + TextView deviceName; + TextView deviceStatus; + TextView deviceBind; + TextView deviceDeBind; + TextView sendData; + } + + private ArrayList mLeDevices; + private LayoutInflater mInflator; + private CallBackBlueToothBind callBackBlueToothBind; + private CallBackBlueToothUnBind callBackBlueToothUnBind; + private CallBackBlueToothSendData callBackBlueToothSendData; + + public LeDeviceListAdapter(CallBackBlueToothBind callBackBlueToothBind,CallBackBlueToothUnBind callBackBlueToothUnBind, + CallBackBlueToothSendData callBackBlueToothSendData) { + super(); + mLeDevices = new ArrayList(); + mInflator = BlueToothDeviceActivity.this.getLayoutInflater(); + this.callBackBlueToothBind=callBackBlueToothBind; + this.callBackBlueToothUnBind=callBackBlueToothUnBind; + this.callBackBlueToothSendData=callBackBlueToothSendData; + } + + public interface CallBackBlueToothBind { + void Click(int position); + } + + public interface CallBackBlueToothUnBind { + void Click(int position); + } + + public interface CallBackBlueToothSendData { + void Click(int position); + } + + public void addDevice(BluetoothDevice device) { + if (!mLeDevices.contains(device)) { + mLeDevices.add(device); + } + } + + public BluetoothDevice getDevice(int position) { + return mLeDevices.get(position); + } + + 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; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + LeDeviceListAdapter.ViewHolder viewHolder; + if (view == null) { + view = mInflator.inflate(R.layout.listitem_device, null); + viewHolder = new LeDeviceListAdapter.ViewHolder(); + viewHolder.deviceName = view.findViewById(R.id.device_name); + viewHolder.deviceStatus = view.findViewById(R.id.device_status); + viewHolder.deviceBind = view.findViewById(R.id.device_bind); + viewHolder.deviceDeBind = view.findViewById(R.id.device_de_bind); + viewHolder.sendData = view.findViewById(R.id.send_data); + view.setTag(viewHolder); + } else { + viewHolder = (LeDeviceListAdapter.ViewHolder) view.getTag(); + } + + BluetoothDevice device = mLeDevices.get(i); + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return null; + } + String deviceName = device.getName(); + if (deviceName != null && !deviceName.isEmpty()) + viewHolder.deviceName.setText(deviceName); + else{ + viewHolder.deviceName.setText(R.string.unknown_device); + } + //当前点击选中的变色 + if (i == selectItem) { + viewHolder.deviceName.getPaint().setFakeBoldText(true); + //viewHolder.deviceName.setTextColor(Color.parseColor("#00FF7F"));//连接之后的颜色 + viewHolder.deviceStatus.setTextColor(Color.parseColor("#00FF7F"));//连接之后的颜色 + viewHolder.deviceStatus.setText("已连接"); + } else { + viewHolder.deviceName.getPaint().setFakeBoldText(false); + //viewHolder.deviceName.setTextColor(Color.parseColor("#00FF7F"));//连接之后的颜色 + viewHolder.deviceStatus.setTextColor(Color.parseColor("#000000")); + viewHolder.deviceStatus.setText("未绑定"); + } + viewHolder.deviceBind.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(callBackBlueToothBind!=null){ + callBackBlueToothBind.Click(i); + } + } + }); + viewHolder.deviceDeBind.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(callBackBlueToothUnBind!=null){ + callBackBlueToothUnBind.Click(i); + } + } + }); + viewHolder.sendData.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(callBackBlueToothSendData!=null){ + callBackBlueToothSendData.Click(i); + } + } + }); + + + + return view; + } + + public void setSelectItem(int selectItem) { + this.selectItem = selectItem; + } + + private int selectItem = -1; + } } \ No newline at end of file diff --git a/app/src/main/java/com/rehome/dywoa/ui/fragment/HomeFragment.java b/app/src/main/java/com/rehome/dywoa/ui/fragment/HomeFragment.java index a905ca1..92cec60 100755 --- a/app/src/main/java/com/rehome/dywoa/ui/fragment/HomeFragment.java +++ b/app/src/main/java/com/rehome/dywoa/ui/fragment/HomeFragment.java @@ -4,6 +4,8 @@ package com.rehome.dywoa.ui.fragment; import static android.app.Activity.RESULT_OK; import android.Manifest; +import android.bluetooth.BluetoothDevice; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Environment; @@ -20,7 +22,11 @@ import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import com.bjzc.blemanager.BleManager; +import com.bjzc.blemanager.BluetoothLeService; +import com.google.gson.Gson; import com.rehome.dywoa.App; import com.rehome.dywoa.Contans; import com.rehome.dywoa.MainActivity; @@ -105,6 +111,8 @@ public class HomeFragment extends BaseFragment { SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd"); + private BleManager ble; + //人脸识别 ActivityResultLauncher launcherResultFaceRecognition; @@ -125,6 +133,45 @@ public class HomeFragment extends BaseFragment { username = App.getInstance().getUserInfo().getManid(); firstDeparment = App.getInstance().getUserInfo().getFirstDeparment(); + ble= BleManager.getInstance(); + String str=ble.init(requireActivity()); + if("OK".equals(str)){ + + } + + ble.setOnReceiveListener(new BleManager.OnReceiveListener() { + @Override + public void onShowMessage(Context context, Intent intent) { + final String action = intent.getAction(); + if (BluetoothDevice.ACTION_FOUND.equals(action)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (ActivityCompat.checkSelfPermission(requireActivity(), Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return; + } + showLog("扫描发现设备" + device.getName() + "," + device.getAddress()); + String deviceName = device.getName(); + if (deviceName != null && !deviceName.isEmpty()){ + showLog(new Gson().toJson(device)); + } + } else if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { + showLog("连接"); + } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { + showLog("断开"); + } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { + showLog("数据传输通道准备就绪,可以发送数据了。"); + } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { + byte[] data= intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA); + showLog("收到传感器数据" + new String(data)); + } + } + }); //android 10 以上 if (context.getExternalFilesDir(null) != null) { diff --git a/app/src/main/res/drawable/btn_pressed_bt.xml b/app/src/main/res/drawable/btn_pressed_bt.xml new file mode 100644 index 0000000..31870a9 --- /dev/null +++ b/app/src/main/res/drawable/btn_pressed_bt.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_selector_bt.xml b/app/src/main/res/drawable/btn_selector_bt.xml new file mode 100644 index 0000000..3fc9046 --- /dev/null +++ b/app/src/main/res/drawable/btn_selector_bt.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_blue_tooth_device.xml b/app/src/main/res/layout/activity_blue_tooth_device.xml index 1d581d0..018f0da 100644 --- a/app/src/main/res/layout/activity_blue_tooth_device.xml +++ b/app/src/main/res/layout/activity_blue_tooth_device.xml @@ -10,7 +10,8 @@ diff --git a/app/src/main/res/layout/listitem_device.xml b/app/src/main/res/layout/listitem_device.xml index a5cbf17..97806ce 100644 --- a/app/src/main/res/layout/listitem_device.xml +++ b/app/src/main/res/layout/listitem_device.xml @@ -5,37 +5,129 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" - android:layout_marginEnd="10dp" android:layout_marginTop="10dp" + android:layout_marginEnd="10dp" android:layout_marginBottom="6dp" app:cardBackgroundColor="@color/xui_config_color_white" app:cardCornerRadius="8dp" app:cardElevation="4dp" app:cardPreventCornerOverlap="true" - app:contentPaddingTop="5dp" - app:contentPaddingBottom="10dp" + app:contentPaddingBottom="5dp" app:contentPaddingLeft="10dp" - app:contentPaddingRight="10dp"> + app:contentPaddingRight="10dp" + app:contentPaddingTop="5dp"> - - - - + + - + android:layout_height="wrap_content" + android:baselineAligned="false" + android:gravity="center_vertical" + android:minHeight="30dp" + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + + +