600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android 低功耗BLE蓝牙连接示例代码

android 低功耗BLE蓝牙连接示例代码

时间:2023-06-29 18:51:44

相关推荐

android 低功耗BLE蓝牙连接示例代码

android 低功耗ble蓝牙连接跟标准的蓝牙连接还是有很大的不同的。本文低功耗蓝牙连接代码是在sdk的版本4.3以上才支持。所用的核心代码连接也是不一样的。

本文demo下载地址:/detail/qq_16064871/9657885

1、区别

常规的蓝牙连接类是BluetoothSocket

final BluetoothDevice device = mBtAdapter.getRemoteDevice(mstrAddress);try {mTransferSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));} catch (IOException e1) {Log.i("err1:", e1.toString());mTransferSocket = null;}mTransferSocket.connect();mInputStream = mTransferSocket.getInputStream();mOutputStream = mTransferSocket.getOutputStream();

2、低功耗蓝牙连接类BluetoothGatt,完整的连接代码如下

/** Copyright (C) The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.southgnss.ble;import android.annotation.SuppressLint;import android.app.Service;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothGatt;import android.bluetooth.BluetoothGattCallback;import android.bluetooth.BluetoothGattCharacteristic;import android.bluetooth.BluetoothGattDescriptor;import android.bluetooth.BluetoothGattService;import android.bluetooth.BluetoothManager;import android.bluetooth.BluetoothProfile;import android.content.Context;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;import java.util.List;import java.util.UUID;/*** Service for managing connection and data communication with a GATT server hosted on a* given Bluetooth LE device.*/@SuppressLint("NewApi")public class BluetoothLeService extends Service {private final static String TAG = BluetoothLeService.class.getSimpleName();private BluetoothManager mBluetoothManager;private BluetoothAdapter mBluetoothAdapter;private String mBluetoothDeviceAddress;private BluetoothGatt mBluetoothGatt;private int mConnectionState = STATE_DISCONNECTED;private static final int STATE_DISCONNECTED = 0;private static final int STATE_CONNECTING = 1;private static final int STATE_CONNECTED = 2;public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";public final static String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";public final static String EXTRA_DATA = "com.example.bluetooth.le.EXTRA_DATA";public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);// Implements callback methods for GATT events that the app cares about. For example,// connection change and services discovered.private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {@Overridepublic void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {String intentAction;if (newState == BluetoothProfile.STATE_CONNECTED) {intentAction = ACTION_GATT_CONNECTED;mConnectionState = STATE_CONNECTED;broadcastUpdate(intentAction);Log.i(TAG, "Connected to GATT server.");// Attempts to discover services after successful connection.Log.i(TAG, "Attempting to start service discovery:" +mBluetoothGatt.discoverServices());} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {intentAction = ACTION_GATT_DISCONNECTED;mConnectionState = STATE_DISCONNECTED;Log.i(TAG, "Disconnected from GATT server.");broadcastUpdate(intentAction);}}@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) {broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);} else {Log.w(TAG, "onServicesDiscovered received: " + status);}}//readCharacteristic的时候会触发@Overridepublic void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,int status) {if (status == BluetoothGatt.GATT_SUCCESS) {broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);}}//需要先打开notify,设定特征值发生变化时调用此方法@Overridepublic void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic) {broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);}};private void broadcastUpdate(final String action) {final Intent intent = new Intent(action);sendBroadcast(intent);}private void broadcastUpdate(final String action,final BluetoothGattCharacteristic characteristic) {final Intent intent = new Intent(action);// This is special handling for the Heart Rate Measurement profile. Data parsing is// carried out as per profile specifications:// /gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xmlif (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {int flag = characteristic.getProperties();int format = -1;if ((flag & 0x01) != 0) {format = BluetoothGattCharacteristic.FORMAT_UINT16;Log.d(TAG, "Heart rate format UINT16.");} else {format = BluetoothGattCharacteristic.FORMAT_UINT8;Log.d(TAG, "Heart rate format UINT8.");}final int heartRate = characteristic.getIntValue(format, 1);Log.d(TAG, String.format("Received heart rate: %d", heartRate));intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));sendBroadcast(intent);} else {// For all other profiles, writes the data formatted in HEX.final byte[] data = characteristic.getValue();/* if (data != null && data.length > 0) {final StringBuilder stringBuilder = new StringBuilder(data.length);for(byte byteChar : data)stringBuilder.append(String.format("%02X ", byteChar));intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());}*/if (data[0]=='A') {return;}else{intent.putExtra(EXTRA_DATA, new String(data));Log.i("yq","data字符串:"+ new String(data));sendBroadcast(intent);}}}public class LocalBinder extends Binder {BluetoothLeService getService() {return BluetoothLeService.this;}}@Overridepublic IBinder onBind(Intent intent) {return mBinder;}@Overridepublic boolean onUnbind(Intent intent) {// After using a given device, you should make sure that BluetoothGatt.close() is called// such that resources are cleaned up properly. In this particular example, close() is// invoked when the UI is disconnected from the Service.close();return super.onUnbind(intent);}private final IBinder mBinder = new LocalBinder();/*** Initializes a reference to the local Bluetooth adapter.** @return Return true if the initialization is successful.*/public boolean initialize() {// For API level 18 and above, get a reference to BluetoothAdapter through// BluetoothManager.if (mBluetoothManager == null) {mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);if (mBluetoothManager == null) {Log.e(TAG, "Unable to initialize BluetoothManager.");return false;}}mBluetoothAdapter = mBluetoothManager.getAdapter();if (mBluetoothAdapter == null) {Log.e(TAG, "Unable to obtain a BluetoothAdapter.");return false;}return true;}/*** Connects to the GATT server hosted on the Bluetooth LE device.** @param address The device address of the destination device.** @return Return true if the connection is initiated successfully. The connection result* is reported asynchronously through the* {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}* callback.*/public boolean connect(final String address) {if (mBluetoothAdapter == null || address == null) {Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");return false;}// Previously connected device. Try to reconnect.if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)&& mBluetoothGatt != null) {Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");if (mBluetoothGatt.connect()) {mConnectionState = STATE_CONNECTING;return true;} else {return false;}}final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);if (device == null) {Log.w(TAG, "Device not found. Unable to connect.");return false;}// We want to directly connect to the device, so we are setting the autoConnect// parameter to false.mBluetoothGatt = device.connectGatt(this, false, mGattCallback);Log.d(TAG, "Trying to create a new connection.");mBluetoothDeviceAddress = address;mConnectionState = STATE_CONNECTING;return true;}/*** Disconnects an existing connection or cancel a pending connection. The disconnection result* is reported asynchronously through the* {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}* callback.*/public void disconnect() {if (mBluetoothAdapter == null || mBluetoothGatt == null) {Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.disconnect();}/*** After using a given BLE device, the app must call this method to ensure resources are* released properly.*/public void close() {if (mBluetoothGatt == null) {return;}mBluetoothGatt.close();mBluetoothGatt = null;}/*** Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported* asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}* callback.** @param characteristic The characteristic to read from.*/public void readCharacteristic(BluetoothGattCharacteristic characteristic) {if (mBluetoothAdapter == null || mBluetoothGatt == null) {Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.readCharacteristic(characteristic);}/*** Enables or disables notification on a give characteristic.** @param characteristic Characteristic to act on.* @param enabled If true, enable notification. False otherwise.*/public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,boolean enabled) {if (mBluetoothAdapter == null || mBluetoothGatt == null) {Log.w(TAG, "BluetoothAdapter not initialized");return;}mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);// This is specific to Heart Rate Measurement.if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);mBluetoothGatt.writeDescriptor(descriptor);}}/*** Retrieves a list of supported GATT services on the connected device. This should be* invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.** @return A {@code List} of supported services.*/public List<BluetoothGattService> getSupportedGattServices() {if (mBluetoothGatt == null) return null;return mBluetoothGatt.getServices();}}

连接成功,收到数据。是以广播的形式发送出去

private void broadcastUpdate(final String action,final BluetoothGattCharacteristic characteristic) {final Intent intent = new Intent(action);// This is special handling for the Heart Rate Measurement profile. Data parsing is// carried out as per profile specifications:// /gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xmlif (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {int flag = characteristic.getProperties();int format = -1;if ((flag & 0x01) != 0) {format = BluetoothGattCharacteristic.FORMAT_UINT16;Log.d(TAG, "Heart rate format UINT16.");} else {format = BluetoothGattCharacteristic.FORMAT_UINT8;Log.d(TAG, "Heart rate format UINT8.");}final int heartRate = characteristic.getIntValue(format, 1);Log.d(TAG, String.format("Received heart rate: %d", heartRate));intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));sendBroadcast(intent);} else {// For all other profiles, writes the data formatted in HEX.final byte[] data = characteristic.getValue();/* if (data != null && data.length > 0) {final StringBuilder stringBuilder = new StringBuilder(data.length);for(byte byteChar : data)stringBuilder.append(String.format("%02X ", byteChar));intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());}*/if (data[0]=='A') {return;}else{intent.putExtra(EXTRA_DATA, new String(data));Log.i("yq","data字符串:"+ new String(data));sendBroadcast(intent);}}}

另外一边就是广播接收数据

// Handles various events fired by the Service.// ACTION_GATT_CONNECTED: connected to a GATT server.// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.// ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read// or notification operations.private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {mConnected = true;updateConnectionState(true);} else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {mConnected = false;updateConnectionState(false);} else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {if (mBluetoothLeService.getSupportedGattServices() != null) {List<BluetoothGattCharacteristic> gattCharacteristics = mBluetoothLeService.getSupportedGattServices().get(mBluetoothLeService.getSupportedGattServices().size()-1).getCharacteristics();if (gattCharacteristics != null) {final BluetoothGattCharacteristic characteristic = gattCharacteristics.get(gattCharacteristics.size()-1);final int charaProp = characteristic.getProperties();if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {if (mNotifyCharacteristic != null) {mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, true);mNotifyCharacteristic = null;}mBluetoothLeService.readCharacteristic(characteristic);}if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {mNotifyCharacteristic = characteristic;mBluetoothLeService.setCharacteristicNotification(characteristic, true);}}}} else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));}}};

广播的相关的注册以及销毁

@Overrideprotected void onResume() {super.onResume();registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());if (mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {mBluetoothLeService.connect(mDeviceAddress);}}@Overrideprotected void onPause() {super.onPause();unregisterReceiver(mGattUpdateReceiver);}@Overrideprotected void onDestroy() {super.onDestroy();if (mBluetoothLeService != null) {unbindService(mServiceConnection);mBluetoothLeService = null;}}

3、完整的连接类的UI逻辑代码

package com.southgnss.ble;import java.util.List;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothGattCharacteristic;import android.content.BroadcastReceiver;import ponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.content.pm.PackageManager;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.southgnss.customwidget.CustomActivity;import com.southgnss.southgnssserver.R;public class SouthOtherConnectActivity extends CustomActivityimplements OnClickListener{private BluetoothLeService mBluetoothLeService;private String mDeviceName = "";private String mDeviceAddress = "";private boolean mConnected = false;private Button mBtnConnect = null;private Button mBtnDisConnect = null;private TextView mTextViewBlueSelect = null;private BluetoothGattCharacteristic mNotifyCharacteristic;private View mLinearLayoutEquipmenList;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);getActionBar().setTitle(R.string.sysytem_type_ble_Blue_connect);getActionBar().setDisplayHomeAsUpEnabled(true);setContentView(R.layout.layout_main_other_connect);initView();}private void initView() {mLinearLayoutEquipmenList = findViewById(R.id.linearLayoutEquipmenList);mLinearLayoutEquipmenList.setOnClickListener(this);mTextViewBlueSelect = (TextView)findViewById(R.id.textViewBlueSelect);if (!mDeviceName.isEmpty()) mTextViewBlueSelect.setText(mDeviceName);if (mDeviceName.isEmpty() && !mDeviceAddress.isEmpty()) mTextViewBlueSelect.setText(mDeviceAddress);//连接按钮mBtnConnect = (Button)findViewById(R.id.buttonConnect);if(mBtnConnect != null){mBtnConnect.setOnClickListener(this);mBtnConnect.setEnabled(false);//默认为不可使用mBtnConnect.setVisibility(View.VISIBLE);}mBtnDisConnect = (Button)findViewById(R.id.buttonDisConnect);mBtnDisConnect.setOnClickListener(this);mBtnDisConnect.setVisibility(View.GONE);}private boolean getBluetoothDivice() {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();if (adapter == null) {// 不支持蓝牙return false;} if (adapter.isEnabled() == false) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); // 设置蓝牙可见性,最多300秒 intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(intent); return true;}return true;}@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.linearLayoutEquipmenList:// 检查当前手机是否支持ble 蓝牙,如果不支持退出程序if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)&& android.os.Build.VERSION.SDK_INT > 17) {ShowTipsInfo(getString(R.string.sysytem_type_ble_Blue_tip));return;}if (!getBluetoothDivice()) {ShowTipsInfo(getString(R.string.sysytem_type_open_Blue));return;}Intent newIntent = new Intent(this, BLESearchConnectActivity.class);startActivityForResult(newIntent, 1000);break;case R.id.buttonConnect:if (!mConnected && mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {mBluetoothLeService.connect(mDeviceAddress);}break;case R.id.buttonDisConnect:if (mConnected && mBluetoothLeService != null) {mBluetoothLeService.disconnect();displayButton(false);}break;default:break;}}// activity的数据的交互@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (data == null || resultCode != RESULT_OK) return;switch (requestCode) {case 1000: //ble蓝牙搜索返回mDeviceName = data.getExtras().getString(BLESearchConnectActivity.EXTRAS_DEVICE_NAME,"");mDeviceAddress = data.getExtras().getString(BLESearchConnectActivity.EXTRAS_DEVICE_ADDRESS);if (!mDeviceName.isEmpty()) mTextViewBlueSelect.setText(mDeviceName);if (mDeviceName.isEmpty() && !mDeviceAddress.isEmpty()) mTextViewBlueSelect.setText(mDeviceAddress);mBtnConnect.setEnabled(true);Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);break;default:break;}}// Code to manage Service lifecycle.private final ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder service) {mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();if (!mBluetoothLeService.initialize()) {finish();}mBluetoothLeService.connect(mDeviceAddress);}@Overridepublic void onServiceDisconnected(ComponentName componentName) {mBluetoothLeService = null;}};// Handles various events fired by the Service.// ACTION_GATT_CONNECTED: connected to a GATT server.// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.// ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read// or notification operations.private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {mConnected = true;updateConnectionState(true);} else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {mConnected = false;updateConnectionState(false);} else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {if (mBluetoothLeService.getSupportedGattServices() != null) {List<BluetoothGattCharacteristic> gattCharacteristics = mBluetoothLeService.getSupportedGattServices().get(mBluetoothLeService.getSupportedGattServices().size()-1).getCharacteristics();if (gattCharacteristics != null) {final BluetoothGattCharacteristic characteristic = gattCharacteristics.get(gattCharacteristics.size()-1);final int charaProp = characteristic.getProperties();if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {if (mNotifyCharacteristic != null) {mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, true);mNotifyCharacteristic = null;}mBluetoothLeService.readCharacteristic(characteristic);}if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {mNotifyCharacteristic = characteristic;mBluetoothLeService.setCharacteristicNotification(characteristic, true);}}}} else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));}}};private void displayData(String data) {if (data != null) {Log.i("Show", data);TextView textViewShow = (TextView)findViewById(R.id.textViewShow);if(textViewShow != null)textViewShow.setText(data);}}private void updateConnectionState(final boolean bConnect) {runOnUiThread(new Runnable() {@Overridepublic void run() {displayButton(bConnect);}});}private void displayButton(boolean bConnect){if (mBtnDisConnect == null || mBtnConnect == null) return;if (bConnect) {mBtnConnect.setVisibility(View.GONE);mBtnDisConnect.setVisibility(View.VISIBLE);mLinearLayoutEquipmenList.setEnabled(false);} else {mBtnDisConnect.setVisibility(View.GONE);mBtnConnect.setVisibility(View.VISIBLE);mLinearLayoutEquipmenList.setEnabled(true);}}private static IntentFilter makeGattUpdateIntentFilter() {final IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);return intentFilter;}@Overrideprotected void onResume() {super.onResume();registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());if (mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {mBluetoothLeService.connect(mDeviceAddress);}}@Overrideprotected void onPause() {super.onPause();unregisterReceiver(mGattUpdateReceiver);}@Overrideprotected void onDestroy() {super.onDestroy();if (mBluetoothLeService != null) {unbindService(mServiceConnection);mBluetoothLeService = null;}}}

使用服务来进行低功耗的蓝牙连接,收到数据后使用广播的发送数据。需要用数据的地方进行接收即可。

整个demo的完整代码:

本文demo下载地址:/detail/qq_16064871/9657885

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。