android實現(xiàn)藍(lán)牙app代碼
更新時間:2018年05月29日 08:22:52 作者:tangzheng828
這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)藍(lán)牙app的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了android實現(xiàn)藍(lán)牙app的具體代碼,供大家參考,具體內(nèi)容如下
private BluetoothGatt bluetoothGatt;
private BluetoothGattService gattService;
private BluetoothGattCharacteristic gattCharacteristic;
private BluetoothManager bluetoothManager;
private BluetoothAdapter bluetoothAdapter;
private List<BluetoothDevice> devices = new ArrayList<>();
private UUID serviceUUID; //不同設(shè)備 不同uuid
private UUID characteristicUUID; //不同設(shè)備 不同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);
}
//重新掃描藍(lán)牙
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.tv_refresh_bluetooth:
//藍(lán)牙掃描
bluetoothScan();
break;
default:
break;
}
}
//打開本地藍(lán)牙
private void openBluetooth() {
Log.i("tag", "openLocalBluetooth()");
//檢查手機是否支持藍(lán)牙4.0
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "手機不支持藍(lán)牙4.0", Toast.LENGTH_SHORT).show();
finish();
}
//調(diào)用系統(tǒng)服務(wù)的方式,請求開啟藍(lán)牙
bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
//開啟藍(lán)牙
if (!bluetoothAdapter.isEnabled()) {
bluetoothAdapter.enable();
}
}
//開始藍(lán)牙掃描 掃描到一個添加一個
private void bluetoothScan() {
Log.i("tag", "bluetoothScan()");
if (bluetoothAdapter == null) {
openBluetooth();
}
if (!bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.startDiscovery(); //回調(diào)
} else {
Toast.makeText(this, "掃描中..", Toast.LENGTH_SHORT).show();
}
}
//更新藍(lán)牙列表中的數(shù)據(jù)
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, "附近沒有藍(lán)牙", Toast.LENGTH_SHORT).show();
}
}
//取得gatt 對應(yīng)的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對應(yīng)的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;
}
//注冊藍(lán)牙掃描監(jiān)聽
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);
}
//定義藍(lán)牙掃描監(jiān)聽類 添加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, "附近沒有發(fā)現(xiàn)藍(lán)牙設(shè)備", Toast.LENGTH_SHORT).show();
}
}
}
}
//注冊燈光監(jiān)聽
private void registeLigthReceiver() {
Log.i("tag", "registeReceiver()");
lightReceiver = new LightReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("openLight");
filter.addAction("closeLight");
registerReceiver(lightReceiver, filter);
}
//定義燈控監(jiān)聽類
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取得的數(shù)據(jù)
lightAction = intent.getAction();
// if() 不同設(shè)備 不同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); //回調(diào)
}
}
//藍(lán)牙連接/通信回調(diào)
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(); //連接成功,開始搜索服務(wù),一定要調(diào)用此方法,否則獲取不到服務(wù)
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"); //這里自己設(shè)置 藍(lán)牙模組需要的數(shù)據(jù)
gatt.writeCharacteristic(gattCharacteristic);
} else if (lightAction.equals("closeLight")) {
gattCharacteristic.setValue("closeLight"); //這里自己設(shè)置 藍(lán)牙模組需要的數(shù)據(jù)
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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Android在類微信程序中實現(xiàn)藍(lán)牙聊天功能的示例代碼
- Android實現(xiàn)藍(lán)牙(BlueTooth)設(shè)備檢測連接
- Android基于ibeacon實現(xiàn)藍(lán)牙考勤功能
- Native.js獲取監(jiān)聽開關(guān)等操作Android藍(lán)牙設(shè)備實例代碼
- Android 6.0 藍(lán)牙搜索不到設(shè)備原因,MIUI權(quán)限申請機制方法
- android藍(lán)牙控制PC端代碼分享
- Android藍(lán)牙庫FastBle的基礎(chǔ)入門使用
- android實現(xiàn)主動連接和被動連接的藍(lán)牙聊天功能
- android實現(xiàn)手機與單片機藍(lán)牙模塊通信
- Android 獲取藍(lán)牙Mac地址的正確方法
- Android如何實現(xiàn)藍(lán)牙配對連接功能
相關(guān)文章
Android ADT和SDK Manager無法更新下載解決方案
這篇文章主要介紹了Android ADT和SDK Manager無法更新下載解決方案的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android中DownloadManager實現(xiàn)文件下載實例詳解
這篇文章主要介紹了Android中DownloadManager實現(xiàn)文件下載實例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android實現(xiàn)數(shù)字跳動效果的TextView方法示例
數(shù)字跳動效果相信大家應(yīng)該都見過,在開發(fā)加上這種效果后會讓ui交互看起來非常不錯,所以下面這篇文章主要給大家介紹了Android實現(xiàn)數(shù)字跳動的TextView的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。2017-04-04
Android開發(fā)之Activity管理工具類完整示例
這篇文章主要介紹了Android開發(fā)之Activity管理工具類,集合完整實例形式分析了Android操作Activity創(chuàng)建、添加、獲取、移除等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
android實現(xiàn)圖片上傳功能(springMvc)
這篇文章主要為大家詳細(xì)介紹了android結(jié)合springMvc實現(xiàn)圖片上傳的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Android來電監(jiān)聽和去電監(jiān)聽實現(xiàn)代碼
本文是關(guān)于來點監(jiān)聽和去電監(jiān)聽展開問題,通過實例代碼講解,對android來電監(jiān)聽和去電監(jiān)聽的相關(guān)知識感興趣的朋友一起看看吧2017-06-06
Android判斷屏幕是橫屏或是豎屏的簡單實現(xiàn)方法
這篇文章主要介紹了Android判斷屏幕是橫屏或是豎屏的簡單實現(xiàn)方法,是Android應(yīng)用開發(fā)中常用的功能,需要的朋友可以參考下2014-07-07

