• 基于STM32的智能小车app自学梳理(一)


    文章目录

    目录

    文章目录

    前言

    一、基本逻辑梳理

    二、android部分蓝牙扫描

    2.1、权限申请

    2.2、相关变量

    2.3、onCreate一些初始化操作

    2.3.1、位置权限

    2.3.2、控件初始化

    2.3.3、蓝牙初始化

    2.4、蓝牙回调函数

    2.4.1、高版本蓝牙回调

    24.2、低版本蓝牙回调函数

    2.5、点击扫描按钮执行操作

    2.5.1、点击事件

    2.5.2、扫描事件

    2.5.3、GPS是否打开

    三、自定义蓝牙适配器内部类

    四、实体类


    前言

    想搞一个蓝牙app与单片机通信,控制小车的前进后退。在Git上找了好多源码,这看看那看看整得,好像都不是那么回事。以前也没整过android,整得我好费劲呀!还是老老实实选一份看看、好好的梳理梳理。

    一、基本逻辑梳理

    用android定义几个个按钮(前后左右),按下按钮则通过android蓝牙发出一个字符给单片机的蓝牙模块接收。蓝牙模块与单片机是串口通信。故比较接收的字符与定义的字符是否一致,一致则执行指定操作。

    通过android蓝牙t调试宝测得CH06的的UUID为:00001101-0000-1000-8000-00805f9b34fb(同一类型设备通用)

    MAC:98:DA:E0:01:0B:4E(每个蓝牙模块MAC唯一)

    单片机部分代码:

    1. u8 reclen=0;
    2. if(USART2_RX_STA&0X8000) //接收到一次数据了
    3. {
    4. reclen=USART2_RX_STA&0X7FFF; //得到数据长度
    5. USART2_RX_BUF[reclen]=0; //加入结束符
    6. printf("USART2_RX_BUF:%s\n",USART2_RX_BUF);
    7. printf("reclen:%d\n",reclen);
    8. if(reclen==1||reclen==2) //控制DS1检测
    9. {
    10. if(strcmp((const char*)USART2_RX_BUF,"A")==0)
    11. {
    12. u2_printf("go forward!");
    13. ZYSTM32_run(80,100);
    14. }
    15. else if(strcmp((const char*)USART2_RX_BUF,"E")==0)
    16. {
    17. u2_printf("go back!");
    18. ZYSTM32_back(80,100);
    19. }
    20. else if(strcmp((const char*)USART2_RX_BUF,"C")==0)
    21. {
    22. u2_printf("go right!");
    23. ZYSTM32_Right(80,100);
    24. }
    25. else if(strcmp((const char*)USART2_RX_BUF,"G")==0)
    26. {
    27. u2_printf("go left!");
    28. ZYSTM32_Left(80,100);
    29. }
    30. else if(strcmp((const char*)USART2_RX_BUF,"X")==0)
    31. {
    32. u2_printf("Stop!");
    33. ZYSTM32_brake(100);
    34. }
    35. else if(strcmp((const char*)USART2_RX_BUF,"Y")==0)
    36. {
    37. u2_printf("Stop!");
    38. ZYSTM32_brake(100);
    39. }
    40. }
    41. USART2_RX_STA=0;
    42. }

    二、android部分蓝牙扫描

    2.1、权限申请

    1. "1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. package="com.example.blueboothproject_01">
    5. <uses-permission android:name="android.permission.BLUETOOTH" />
    6. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    7. <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
    8. <uses-permission android:name="android.permission.BLUETOOTH"/>
    9. <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    10. <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    11. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    12. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    13. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    14. <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    15. <uses-feature android:name="android.hardware.location.gps"/>
    16. <application
    17. android:dataExtractionRules="@xml/data_extraction_rules"
    18. android:fullBackupContent="@xml/backup_rules"
    19. android:icon="@mipmap/ic_launcher"
    20. android:label="@string/app_name"
    21. android:roundIcon="@mipmap/ic_launcher_round"
    22. android:supportsRtl="true"
    23. android:theme="@style/Theme.BlueBoothProject_01"
    24. tools:targetApi="31">
    25. <activity android:name=".MainActivity"
    26. android:exported="true">
    27. <intent-filter>
    28. <action android:name="android.intent.action.MAIN" />
    29. <category android:name="android.intent.category.LAUNCHER" />
    30. intent-filter>
    31. activity>
    32. <activity android:name=".Ble_Activity" android:exported="true"/>
    33. <service
    34. android:name="com.example.blueboothproject_01.service.BluetoothleService"
    35. android:enabled="true">
    36. service>
    37. <activity android:name=".DebugActivity"
    38. android:resizeableActivity="true"
    39. />
    40. application>
    41. manifest>

    2.2、相关变量

    1. // 通过按键扫描蓝牙
    2. private Button BlueBooth_Scan_btn;
    3. // 获取蓝牙适配器
    4. private BluetoothAdapter mbluetoothAdapter;
    5. // 低功耗蓝牙扫描回调类
    6. private ScanCallback mScanCalBack;
    7. // 低功耗蓝牙扫描装置
    8. private BluetoothLeScanner mBluetoothLeScanner;
    9. // 蓝牙信号强度
    10. private ArrayList rssis;
    11. // 自定义适配器
    12. private LeDeviceListAdapter mleDeviceListAdpater;
    13. // 显示扫描到的蓝牙信息 Listview
    14. private ListView lv;
    15. // 蓝牙的扫描状态
    16. // 扫描中
    17. private boolean mScanming;
    18. // 扫描标记
    19. private boolean Scan_Flag;
    20. // 操作类
    21. private Handler mhandler;
    22. // 请求使能
    23. int REQUEST_ENABLE_BIT = 1;
    24. // 蓝牙扫描时间
    25. private static final long SCAN_PERIOD = 4000;

    2.3、onCreate一些初始化操作

    1. /**
    2. * 一个activity启动调用的第一个函数就是onCreate,
    3. * 它主要做这个activity启动时一些必要的初始化工作
    4. * @param savedInstanceState
    5. */
    6. @Override
    7. protected void onCreate(Bundle savedInstanceState) {
    8. super.onCreate(savedInstanceState);
    9. // 加载activity_main.xml
    10. setContentView(R.layout.activity_main);
    11. // 申请位置权限
    12. Permissions_Init();
    13. // 控件初始化
    14. UI_Init();
    15. // 蓝牙初始化
    16. BlueTooth_Init();
    17. // 绑定蓝牙 Build.VERSION_CODES.R sdk版本
    18. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    19. // 回调函数
    20. setScanCallBack();
    21. // 开始扫描
    22. boolean Scan_Flag = true;
    23. // 创建一个自定义适配器类型对象
    24. mleDeviceListAdpater = new LeDeviceListAdapter();
    25. // 为listview指定适配器
    26. lv.setAdapter(mleDeviceListAdpater);
    27. // listview点击函数
    28. lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    29. @Override
    30. public void onItemClick(AdapterView parent, View view, int position, long id) {
    31. // 获取列表中指定位置的元素
    32. final BluetoothMessage bluetoothMessage = mleDeviceListAdpater.getDevice(position);
    33. // 判空
    34. if(bluetoothMessage==null)
    35. return;
    36. final Intent intent = new Intent(MainActivity.this, com.example.blueboothproject_01.Ble_Activity.class);
    37. // 向意图添加扩展数据。名称必须包含包前缀,
    38. // 例如应用程序com.android.contacts将使用“com.android.contacts. showall”这样的名称。
    39. // 蓝牙名称
    40. intent.putExtra(com.example.blueboothproject_01.Ble_Activity.EXTRAS_DEVICE_NAME,
    41. bluetoothMessage.getName()!=null?bluetoothMessage.getName():bluetoothMessage.getDevice().getName());
    42. // 蓝牙地址
    43. intent.putExtra(com.example.blueboothproject_01.Ble_Activity.EXTRAS_DEVICE_ADDRESS,
    44. bluetoothMessage.getDevice().getAddress());
    45. // 信号强度
    46. intent.putExtra(com.example.blueboothproject_01.Ble_Activity.EXTRAS_DEVICE_RSSI,
    47. rssis.get(position).toString());
    48. if(mScanming){
    49. // 停止扫描
    50. if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.R){
    51. // 停止正在进行的蓝牙LE扫描
    52. mBluetoothLeScanner.stopScan(mScanCalBack);
    53. }else{
    54. // 停止正在进行的蓝牙LE设备扫描。
    55. mbluetoothAdapter.stopLeScan(mLeScanCallback);
    56. }
    57. mScanming= false;
    58. }
    59. try{
    60. // 启动booth_activity组
    61. startActivity(intent);
    62. }catch (Exception e){
    63. // 异常处理
    64. e.printStackTrace();
    65. }
    66. }
    67. });
    68. // 蓝牙扫描 设置一个点击事件
    69. BlueBooth_Scan_btn.setOnLongClickListener(new View.OnLongClickListener(){
    70. @Override
    71. public boolean onLongClick(View v) {
    72. startActivity(new Intent(MainActivity.this,DebugActivity.class));
    73. return false;
    74. }
    75. });
    76. }
    77. }

    2.3.1、位置权限

    1. private void Permissions_Init() {
    2. // 确定是否已授予您特定的权限。
    3. if (ContextCompat.checkSelfPermission(this,
    4. Manifest.permission_group.LOCATION)!= PackageManager.PERMISSION_GRANTED) {
    5. // 获取wifi连接需要定位权限,没有获取权限
    6. ActivityCompat.requestPermissions((Activity) this, new String[]{
    7. Manifest.permission.ACCESS_FINE_LOCATION,
    8. Manifest.permission.ACCESS_COARSE_LOCATION,
    9. Manifest.permission.ACCESS_WIFI_STATE,
    10. }, 1);
    11. }
    12. }

    2.3.2、控件初始化

    1. /**
    2. * ********************************************************************************
    3. * 控件初始化
    4. * ********************************************************************************
    5. */
    6. private void UI_Init() {
    7. BlueBooth_Scan_btn = this.findViewById(R.id.scan_btn);
    8. BlueBooth_Scan_btn.setOnClickListener(this);
    9. ListView lv = this.findViewById(R.id.lv);
    10. mhandler = new Handler();
    11. }

    2.3.3、蓝牙初始化

    1. /**
    2. * ********************************************************************************
    3. * 蓝牙初始化
    4. * ********************************************************************************
    5. */
    6. private void BlueTooth_Init() {
    7. // 一、手机硬件是否支持蓝牙
    8. if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    9. Toast.makeText(this, "Non-Supported BlueBooth-ble-devices", Toast.LENGTH_SHORT).show();
    10. finish();
    11. }
    12. // 二、从手机获取本机蓝牙适配器
    13. final BluetoothManager mbluetootManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    14. // AnBuild.VERSION.SDK_INT是一个静态变量,代表运行该应用的手机系统的SDK版本
    15. // Build.VERSION_CODES.R 当前编译器的版本号
    16. // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    17. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
    18. // 从系统服务中获取蓝牙管理器
    19. mbluetoothAdapter = mbluetootManager.getAdapter();
    20. } else {
    21. // 获取系统默认的蓝牙适配器
    22. mbluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    23. }
    24. // 三、 le设备的扫描
    25. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
    26. mBluetoothLeScanner = mbluetoothAdapter.getBluetoothLeScanner();
    27. // 打开蓝牙权限
    28. if (mbluetoothAdapter == null || !mbluetoothAdapter.isEnabled()) {
    29. Intent enableBtIntent = new Intent(
    30. BluetoothAdapter.ACTION_REQUEST_ENABLE);
    31. startActivityForResult(enableBtIntent, REQUEST_ENABLE_BIT);
    32. /* 打开蓝牙权*/
    33. // Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    34. //,打开一个 Activity ,在打开的 Activity 中操作之后并获得返回结果。
    35. // startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    36. /*
    37. * 1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");
    38. 2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
    39. 3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
    40. 4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
    41. 5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。*/
    42. // 打开蓝牙
    43. }
    44. }

    2.4、蓝牙回调函数

    2.4.1、高版本蓝牙回调

    1. /**
    2. * ********************************************************************************
    3. * 高版本回调函数
    4. * ********************************************************************************
    5. */
    6. private void setScanCallBack() {
    7. // 蓝牙LE扫描回调。使用这些回调来报告扫描结果。
    8. mScanCalBack = new ScanCallback() {
    9. // 重写扫描结果 回调类型 扫描结果集
    10. public void onScanResult(int callbackType, final ScanResult result) {
    11. // 获取蓝牙设备
    12. final BluetoothDevice device = result.getDevice();
    13. // 获取蓝牙设备信息
    14. final BluetoothMessage bluetoothMessage = new BluetoothMessage(device);
    15. // 获取蓝牙设备信息
    16. if (null != device || null != result.getScanRecord()) {
    17. try {
    18. // 蓝牙设备名字非空
    19. if (device.getName() != null) {
    20. // 获取设备名称
    21. byte[] name = ParseLeAdvDate.adv_report_parse(
    22. ParseLeAdvDate.BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
    23. result.getScanRecord().getBytes());
    24. if (name != null)
    25. bluetoothMessage.setName(new String(name, "utf-8"));
    26. }
    27. } catch (UnsupportedEncodingException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. // 在UI线程上运行指定的操作。如果当前线程是UI线程,那么操作将立即执行。
    32. // 如果当前线程不是UI线程,则动作被提交到UI线程的事件队列中。
    33. runOnUiThread(new Runnable() {
    34. @Override
    35. public void run() {
    36. // 讲扫描到的信息输出到ListView的适配器 蓝牙信号强度
    37. mleDeviceListAdpater.addDevice(bluetoothMessage, result.getRssi());
    38. // 数据更新 通知附加的观察者基础数据已经被更改,任何反映数据集的视图都应该刷新自己。
    39. mleDeviceListAdpater.notifyDataSetChanged();
    40. }
    41. });
    42. }
    43. @Override
    44. public void onScanFailed(final int errorCode)
    45. {
    46. super.onScanFailed(errorCode);
    47. runOnUiThread(new Runnable() {
    48. @Override
    49. public void run() {
    50. // LENGTH_SHORT:显示短时间内的视图或文本通知。这一次可能是用户可定义的。这是默认值。
    51. Toast.makeText(MainActivity.this,"扫描出错:"+errorCode,Toast.LENGTH_SHORT).show();
    52. }
    53. });
    54. }
    55. };
    56. }

    24.2、低版本蓝牙回调函数

    1. /***************************************************************
    2. * 低版本蓝牙回调函数
    3. * ************************************************************/
    4. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback()
    5. {
    6. @Override
    7. public void onLeScan(final BluetoothDevice device, final int rssi,
    8. byte[] scanRecord)
    9. {
    10. // TODO Auto-generated method stub
    11. runOnUiThread(new Runnable()
    12. {
    13. @Override
    14. public void run()
    15. {
    16. // 讲扫描到设备的信息输出到listview的适配器
    17. BluetoothMessage bluetoothMessage = new BluetoothMessage(device);
    18. mleDeviceListAdpater.addDevice(bluetoothMessage, rssi);
    19. mleDeviceListAdpater.notifyDataSetChanged();
    20. }
    21. });
    22. }
    23. };

    2.5、点击扫描按钮执行操作

    2.5.1、点击事件

    1. /********************************************************************
    2. * 点击事件 ble_active
    3. ********************************************************************/
    4. @Override
    5. public void onClick(View v) {
    6. if(!isOpenGPS(this)){
    7. AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this,AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
    8. builder.setTitle("提示")
    9. .setMessage("请前往打开手机的位置权限!")
    10. .setCancelable(false)
    11. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    12. @Override
    13. public void onClick(DialogInterface dialog, int which) {
    14. Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    15. startActivityForResult(intent, 10);
    16. }
    17. }).show();
    18. return;
    19. }
    20. if (Scan_Flag){
    21. mleDeviceListAdpater = new LeDeviceListAdapter(); //自定义适配器
    22. lv.setAdapter(mleDeviceListAdpater); //设置listview为自定义适配器
    23. scanLeDevice(true); //点击按键开始扫描设备
    24. } else {
    25. scanLeDevice(false);
    26. BlueBooth_Scan_btn.setText("扫描设备");
    27. }
    28. }

    2.5.2、扫描事件

    1. private void scanLeDevice(boolean enable) {
    2. //将定义的蓝牙适配器进行版本适配操作
    3. if (mbluetoothAdapter == null) {
    4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
    5. mbluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    6. else {
    7. BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    8. mbluetoothAdapter = bluetoothManager.getAdapter();
    9. }
    10. }
    11. //将蓝牙扫描器进行适配操作
    12. if (mBluetoothLeScanner == null){
    13. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
    14. mBluetoothLeScanner = mbluetoothAdapter.getBluetoothLeScanner();
    15. }
    16. if (enable) {
    17. // 10s后停止扫描
    18. mhandler.postDelayed(new Runnable()
    19. {
    20. @Override
    21. public void run()
    22. {
    23. mScanming = false;
    24. Scan_Flag = true;
    25. BlueBooth_Scan_btn.setText("扫描设备");
    26. Log.i("SCAN", "stop.....................");
    27. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
    28. mBluetoothLeScanner.stopScan(mScanCalBack);
    29. else
    30. mbluetoothAdapter.stopLeScan(mLeScanCallback);
    31. }
    32. }, SCAN_PERIOD);//10s后启动停止线程
    33. /* 开始扫描蓝牙设备,带mLeScanCallback 回调函数 */
    34. Log.i("SCAN", "begin.....................");
    35. mScanming = true;
    36. Scan_Flag = false;
    37. BlueBooth_Scan_btn.setText("停止扫描");
    38. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
    39. mBluetoothLeScanner.startScan(mScanCalBack);
    40. else
    41. mbluetoothAdapter.startLeScan(mLeScanCallback);
    42. } else {
    43. Log.i("Stop", "stoping................");
    44. mScanming = false;
    45. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
    46. mBluetoothLeScanner.stopScan(mScanCalBack);
    47. else
    48. mbluetoothAdapter.stopLeScan(mLeScanCallback);
    49. Scan_Flag = true;
    50. }
    51. }

    2.5.3、GPS是否打开

    1. private boolean isOpenGPS(final Context context) {
    2. LocationManager locationManager
    3. = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    4. // GPS定位
    5. boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    6. // 网络服务定位
    7. boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    8. if (gps || network) {
    9. return true;
    10. } return false;
    11. }

    三、自定义蓝牙适配器内部类

    1. /********************************************************************
    2. * 自定义适配器作为Listview的适配器
    3. ********************************************************************/
    4. private class LeDeviceListAdapter extends BaseAdapter {
    5. /**ArrayList:
    6. * 实现所有可选的列表操作,并允许所有元素,包括null。除了实现List接口之外,
    7. *这个类还提供了一些方法来操作用于内部存储列表的数组的大小。
    8. *(这个类大致相当于Vector,只是它是非同步的。)
    9. * 泛型:
    10. * 标记符号ArrayL T--java类
    11. * E - Element (在集合中使用,因为集合中存放的是元素)
    12. * T - Type(Java 类)
    13. * K - Key(键)
    14. * V - Value(值)
    15. * N - Number(数值类型)
    16. * ? - 表示不确定的 java 类型
    17. * */
    18. // 低功耗设备
    19. private ArrayList mLeDevice;
    20. // 将布局XML文件实例化为相应的View对象。
    21. // 它从不直接使用。相反,使用android.app.Activity.getLayoutInflater()或Context。getSystemService
    22. // 来检索一个标准的LayoutInflater实例,该实例已经连接到当前上下文,并为正在运行的设备正确配置
    23. private LayoutInflater mInflator;
    24. public LeDeviceListAdapter(){
    25. super();
    26. rssis = new ArrayList();
    27. mLeDevice = new ArrayList();
    28. // 快速访问此窗口从其上下文检索的LayoutInflater实例。
    29. //Layout: 一个用于加载布局的系统服务,就是实例化与Layout XML文件对应的View对象,不能直接使用,
    30. // 需要通过getLayoutInflater( )方法或getSystemService( )方法来获得与当前Context绑定的 LayoutInflater实例!
    31. mInflator = getLayoutInflater();
    32. }
    33. // 添加设备
    34. public void addDevice(BluetoothMessage device,int rssi) {
    35. // 变量已添加的设备剔除相同地址的蓝牙
    36. // 遍历已添加的设备 剔除相同地址的蓝牙
    37. for(BluetoothMessage mLeDevice:mLeDevice) {
    38. if(mLeDevice.getDevice().getAddress().equals(device.getDevice().getAddress())) {
    39. return;
    40. }
    41. }
    42. if(device.getName()!=null){
    43. // 将指定的元素追加到列表的末尾。
    44. mLeDevice.add(device);
    45. rssis.add(rssi);
    46. }
    47. }
    48. // 获取列表中元素的位置信息
    49. public BluetoothMessage getDevice(int position){
    50. // 返回位于列表中指定位置的元素
    51. return mLeDevice.get(position);
    52. }
    53. // 从列表中删除所有元素。这个调用返回后,列表将为空。
    54. public void Clear(){
    55. mLeDevice.clear();
    56. rssis.clear();
    57. }
    58. // 返回列表中元素的个数。
    59. @Override
    60. public int getCount() {
    61. return mLeDevice.size();
    62. }
    63. // 返回位于列表中指定位置的元素。
    64. @Override
    65. public Object getItem(int i) {
    66. return mLeDevice.get(i);
    67. }
    68. @Override
    69. public long getItemId(int i) {
    70. return i;
    71. }
    72. @Override
    73. public View getView(int i, View view, ViewGroup parent) {
    74. view = mInflator.inflate(R.layout.listtiem,null);
    75. // 初始化三个textview 显示蓝牙信息
    76. // 地址
    77. TextView deviceAddress = view.findViewById(R.id.tv_deviceAddr);
    78. // 设备名称
    79. TextView deviceName = view.findViewById(R.id.tv_deviceName);
    80. // 信号强度
    81. TextView rssi = view.findViewById(R.id.tv_rssi);
    82. BluetoothMessage bluetoothMessage = mLeDevice.get(i);
    83. // 返回此蓝牙设备的硬件地址。
    84. // 例如,“00:11:22:AA: BB: CC”。
    85. deviceAddress.setText(bluetoothMessage.getDevice().getAddress());
    86. // 如果布尔表达式的值为 true ,则返回 表达式1 的值,否则返回 表达式2 的值
    87. // 布尔表达式 (bluetoothMessage.getName()!=null) ? 表达式1(bluetoothMessage.getName()):表达式2(bluetoothMessage.getDevice().getName())
    88. deviceName.setText(bluetoothMessage.getName()!=null?bluetoothMessage.getName():bluetoothMessage.getDevice().getName());
    89. rssi.setText(""+rssis.get(i));
    90. return view;
    91. }
    92. }

    四、实体类

    1. public class BluetoothMessage {
    2. // 蓝牙设备
    3. private BluetoothDevice mDevice;
    4. // 设备名称
    5. private String mName;
    6. // 蓝牙远程设备
    7. // 表示远程蓝牙设备。BluetoothDevice允许您创建与相应设备的连接,或者查询有关设备的信息,比如名称、地址、类和绑定状态。
    8. public BluetoothMessage(BluetoothDevice device){
    9. this.mDevice = device;
    10. }
    11. // 设置名称
    12. public void setName(String name){
    13. this.mName = name;
    14. }
    15. // 获取设备
    16. public BluetoothDevice getDevice()
    17. {
    18. return mDevice;
    19. }
    20. // 获取名称
    21. public String getName(){
    22. return mName;
    23. }
    24. }

  • 相关阅读:
    Android官方ShapeableImageView描边/圆形/圆角图,xml布局实现
    元宇宙 • 数学 • NFT
    类似Postman可视化API快速低代码工具生成源码
    Primavera Unifier 自定义报表制作及打印分享
    服务器硬件基础知识
    Spring框架教程
    Netty(一)NIO-基础
    git 进阶
    线代——基础解系 vs 特征向量
    复习单片机:单灯闪烁(内含设计思路和原始代码)
  • 原文地址:https://blog.csdn.net/RONG_YAO/article/details/126774065