成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

android - 安卓app實現與藍牙模塊的數據通信,當藍牙模塊離開有效距離時與手機app斷開連接,app想在斷開連接時有所提示,要怎么實現

瀏覽:259日期:2024-08-26 14:18:32

問題描述

/**

簡化藍牙操作的工具類*/

public class BluetoothUtils {

public static final int ENABLE_BLUETOOTH = 0; // 發現藍牙未開啟發送的開啟藍牙消息public static final int DEVICE_SCAN_STARTED = 1; // 掃描設備開始時發送的消息public static final int DEVICE_SCAN_STOPPED = 2; // 掃描終止時發送的消息public static final int DEVICE_SCAN_COMPLETED = 3; // 掃描設備完成時發送的消息public static final int DEVICE_CONNECTED = 4; // 連接上設備時發送的消息public static final int DATA_SENDED = 5; // 發送數據后發送清除edittext內容的消息public static final int DATA_READED = 6; // 讀取到數據后發送使適配器更新的消息public static final int CHARACTERISTIC_ACCESSIBLE = 7; // 可操作特征值時發送的消息private boolean mScanning; // 設備掃描狀態的標志private byte[] readedData; // 讀取到的字節數組數據private Context context;private Handler handler;private BluetoothAdapter mBleAdapter;private BluetoothGatt mBluetoothGatt;private BluetoothGattCharacteristic mCharacteristic;private DeviceListAdapter mDeviceListAdapter;private DataBuffer dataBuffer;public BluetoothUtils(Context context, Handler handler) { this.context = context; this.handler = handler;dataBuffer = new DataBuffer(4096); }public void initialize() { BluetoothManager manager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE); mBleAdapter = manager.getAdapter(); mDeviceListAdapter = new DeviceListAdapter(context);}/** * 檢測藍牙開啟狀態,若未開啟則發送開啟藍牙消息 */public void checkBluetoothEnabled() { if (mBleAdapter == null || !mBleAdapter.isEnabled()) {Message message = new Message();message.what = ENABLE_BLUETOOTH;handler.sendMessage(message); }}/** * 檢測當前設備掃描的狀態,若在掃描中則停止掃描 */public void checkDeviceScanning() { if (mScanning) {scanBleDevice(false); }}/** * 檢測藍牙連接狀態,若已連接則斷開并關閉連接 */public void checkGattConnected() { if (mBluetoothGatt != null) {if (mBluetoothGatt.connect()) { mBluetoothGatt.disconnect(); mBluetoothGatt.close();} }}/** * 掃描設備的方法,掃描按鈕點擊后調用,掃描持續3秒 * * @param enable 掃描方法的使能標志 */public void scanBleDevice(boolean enable) { if (enable) {handler.postDelayed(new Runnable() { @Override public void run() {mScanning = false;mBleAdapter.stopLeScan(mLeScanCallback);Message message = new Message();message.what = DEVICE_SCAN_COMPLETED;handler.sendMessage(message); }}, 5000);mScanning = true; //mBleAdapter.startLeScan(new UUID[] {UUID.fromString('0000F445-0000-1000-8000-00805F9B34FB'),UUID.fromString('0000FEE0-0000-1000-8000-00805F9B34FB')},mLeScanCallback);mBleAdapter.startLeScan(mLeScanCallback);Message message = new Message();message.what = DEVICE_SCAN_STARTED;handler.sendMessage(message); } else {mScanning = false;mBleAdapter.stopLeScan(mLeScanCallback);Message message = new Message();message.what = DEVICE_SCAN_STOPPED;handler.sendMessage(message); }}/** * 往特征值里寫入數據的方法 * * @param data 字節數組類型的數據 */public void writeData(byte[] data) { if (mBluetoothGatt != null) {if (mBluetoothGatt.connect() && mCharacteristic != null &&data != null) { mCharacteristic.setValue(data); mBluetoothGatt.writeCharacteristic(mCharacteristic);} }}/** * 創建一個新的設備列表對話框 */public void creatDeviceListDialog() { if (mDeviceListAdapter.getCount() > 0) {new AlertDialog.Builder(context).setCancelable(true) .setAdapter(mDeviceListAdapter, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) { BluetoothDevice device = mDeviceListAdapter.getDevice(which); mBluetoothGatt = device.connectGatt(context, false, mGattCallback);} }).show(); }}/** * 開啟特征值的notification,然后才能讀取數據 */public void setCharacteristicNotification() { String clientUuid = '00002902-0000-1000-8000-00805f9b34fb'; mBluetoothGatt.setCharacteristicNotification(mCharacteristic, true); BluetoothGattDescriptor descriptor = mCharacteristic. getDescriptor(UUID.fromString(clientUuid)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor);}/** * 字節數組轉化為標準的16進制字符串 * * @param bytes 字節數組數據 * @return 字符串 */public String bytesToString(byte[] bytes) { final char[] hexArray = '0123456789ABCDEF'.toCharArray(); char[] hexChars = new char[bytes.length * 2]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) {int v = bytes[i] & 0xFF;hexChars[i * 2] = hexArray[v >>> 4];hexChars[i * 2 + 1] = hexArray[v & 0x0F];sb.append(hexChars[i * 2]);sb.append(hexChars[i * 2 + 1]);sb.append(’ ’); } return sb.toString();}/** * 將字符串轉為16進制值的字節數組 * * @param s 字符串數據 * @return buf 字節數組 */public byte[] stringToBytes(String s) { byte[] buf = new byte[s.length() / 2]; for (int i = 0; i < buf.length; i++) {try { buf[i] = (byte) Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16);} catch (NumberFormatException e) { e.printStackTrace();} } return buf;}/** * Ascii編碼的字節數組轉化為對應的字符串 * * @param bytes 字節數組 * @return 字符串 */public String asciiToString(byte[] bytes) { char[] buf = new char[bytes.length]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < buf.length; i++) {buf[i] = (char) bytes[i];sb.append(buf[i]); } return sb.toString();}/** * 變換文本的方法,有動畫效果 * * @param textView 目標文本view對象 * @param convertTextId 變換后的文本resId */public void convertText(final TextView textView, final int convertTextId) { final Animation scaleIn = AnimationUtils.loadAnimation(context, R.anim.text_scale_in); Animation scaleOut = AnimationUtils.loadAnimation(context, R.anim.text_scale_out); scaleOut.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) { textView.setText(convertTextId); textView.startAnimation(scaleIn);}@Overridepublic void onAnimationRepeat(Animation animation) {} }); textView.startAnimation(scaleOut);}/** * 獲取已連接設備的設備名 * * @return 字符串形式的設備名 */public String getDeviceName() { return mBluetoothGatt.getDevice().getName();}/** * 獲取已讀取的數據 * * @return 字節數組數據 */public byte[] getReadedData() { return readedData;}/** * 獲取已讀取的數據長度 * * @return */public int getDataLen() { return dataBuffer.getSize();}/** * 獲取已讀取的數據 * * @return */public int getData(byte[] data_out,int len) { return dataBuffer.dequeue(data_out, len);}

/** * 連接Gatt之后的回調 */private BluetoothGattCallback mGattCallback =new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {if (newState == BluetoothProfile.STATE_CONNECTED) { Message message = new Message(); message.what = DEVICE_CONNECTED; handler.sendMessage(message); mDeviceListAdapter.clear(); gatt.discoverServices();} } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {if (characteristic != null) { dataBuffer.enqueue(characteristic.getValue(), characteristic.getValue().length); Message message = new Message(); message.what = DATA_READED; handler.sendMessage(message);} } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {if (status == BluetoothGatt.GATT_SUCCESS) { Message message = new Message(); message.what = DATA_SENDED; handler.sendMessage(message);} } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) {if (status == BluetoothGatt.GATT_SUCCESS) { // 得到目標特征值 String serviceUuid = '0000fee0-0000-1000-8000-00805f9b34fb'; String characterUuid = '0000fee1-0000-1000-8000-00805f9b34fb'; BluetoothGattService service = gatt.getService(UUID .fromString(serviceUuid)); mCharacteristic = service.getCharacteristic(UUID .fromString(characterUuid)); //開啟通知 setCharacteristicNotification(); Message message = new Message(); message.what = CHARACTERISTIC_ACCESSIBLE; handler.sendMessage(message);} } };/** * 藍牙掃描時的回調 */private BluetoothAdapter.LeScanCallback mLeScanCallback =new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {String buf = bytesToString(scanRecord);System.out.println('BluetoothUtils.enclosing_method():'+device.getName()+'nscanRecord'+buf+'rssi:'+rssi);//if ('E0 FE'.equals(buf.substring(0, buf.length()))) { mDeviceListAdapter.addDevice(device); mDeviceListAdapter.notifyDataSetChanged();} }};

}如上是藍牙操作的工具類,想在藍牙模塊與app斷開連接時,app那邊有提示大概怎么實現

列表項目

問題解答

回答1:

android - 安卓app實現與藍牙模塊的數據通信,當藍牙模塊離開有效距離時與手機app斷開連接,app想在斷開連接時有所提示,要怎么實現這里不就是連接狀態的回調嗎?

else if (newState == BluetoothProfile.STATE_DISCONNECTED) { TODO 這里做斷開以后的邏輯}

成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
777午夜精品免费视频| 风间由美一区二区av101| 国产91精品露脸国语对白| 在线视频国内自拍亚洲视频| 亚洲mv大片欧洲mv大片精品| 一区二区精品国产| 亚洲日本va午夜在线电影| 国内揄拍国内精品久久| 国产婷婷色一区二区三区 | 欧美成人日本| 久久久久久久久免费| 国产精品91一区二区| 在线日韩国产精品| 奇米色一区二区三区四区| 色噜噜久久综合| 日韩专区在线视频| 色播五月激情综合网| 日本欧美在线看| 久久亚洲一区| 成人午夜av影视| 久久天天做天天爱综合色| 99久久er热在这里只有精品15| 亚洲精品在线观| av一区二区三区| 久久久不卡影院| 欧美女激情福利| 日韩精品一区二区三区视频播放 | 欧美一区二区在线播放| 国产一区亚洲一区| 制服丝袜一区二区三区| 岛国精品在线观看| 久久亚洲影视婷婷| 91视频免费看| 国产精品国产三级国产aⅴ中文 | 亚洲香蕉伊在人在线观| 欧美亚洲在线| 奇米影视在线99精品| 欧美色大人视频| 国产精品伊人色| 久久久噜噜噜久久人人看| 国产字幕视频一区二区| 亚洲精品日韩专区silk | 精品久久久久久亚洲综合网| 成人av电影免费在线播放| 国产视频一区二区在线观看| 欧美三级乱码| 亚洲第一二三四区| 欧美日韩国产乱码电影| 波多野结衣亚洲| 中文字幕在线播放不卡一区| 一区二区三区四区五区视频| 亚洲成人资源网| 欧美日韩在线播放一区| 粉嫩aⅴ一区二区三区四区| 国产欧美日韩精品在线| 99亚洲视频| 日本不卡视频一二三区| 欧美精选在线播放| 国产精品一区二区91| 国产亚洲欧美日韩俺去了| 在线观看欧美一区| 青青国产91久久久久久| 精品国产髙清在线看国产毛片| 欧美日本亚洲韩国国产| 天天操天天色综合| 欧美一级欧美一级在线播放| 欧美午夜精品| 免费在线欧美视频| 久久精品网站免费观看| 亚洲在线黄色| 国产精品一区三区| 中文字幕一区二区不卡| 色综合久久久久综合| 国产精品18久久久久久久久| 久久久国产午夜精品| 午夜亚洲伦理| 风间由美中文字幕在线看视频国产欧美 | 亚洲欧洲av在线| 日本丶国产丶欧美色综合| 国产电影一区在线| 国产精品久久久久一区二区三区共| 亚洲一区二区三区免费观看 | 久久久99爱| 成人精品一区二区三区中文字幕| 国产精品久久综合| 色哟哟国产精品| 97超碰欧美中文字幕| 丝袜亚洲精品中文字幕一区| 精品国产区一区| 香蕉久久国产| kk眼镜猥琐国模调教系列一区二区| 一区二区三区国产豹纹内裤在线| 日韩一区二区三区av| 国产亚洲二区| 成人免费不卡视频| 亚洲一区二区三区国产| wwwwxxxxx欧美| 六月婷婷一区| 色综合天天综合网国产成人综合天 | 亚洲精品裸体| 国产成人在线免费| 亚洲精品视频观看| 日韩免费视频线观看| 美女爽到呻吟久久久久| 91麻豆文化传媒在线观看| 久久狠狠亚洲综合| 一区二区三区自拍| 日韩精品专区在线影院重磅| 久久九九国产| 狠狠久久婷婷| 高清beeg欧美| 日韩电影在线观看电影| 国产精品乱人伦| 91麻豆精品国产91久久久久| 国产精品嫩草99av在线| 欧美成人综合| 国产在线不卡一卡二卡三卡四卡| 亚洲视频小说图片| 久久综合久久鬼色中文字| 欧美日韩在线精品一区二区三区激情| 亚洲欧洲一区二区天堂久久| 成人黄动漫网站免费app| 人人狠狠综合久久亚洲| 亚洲人成7777| 2020日本不卡一区二区视频| 欧美日韩国产综合一区二区三区| 国产一区二区三区久久久久久久久| 97se亚洲国产综合自在线不卡| 精品在线免费观看| 午夜日韩在线观看| 亚洲色图一区二区| 国产亚洲精品精华液| 91精品国产色综合久久ai换脸 | 在线欧美小视频| 在线亚洲自拍| 欧美破处大片在线视频| 成人精品电影在线观看| 精品在线亚洲视频| 日韩成人免费电影| 亚洲午夜精品久久久久久久久| 欧美国产一区二区在线观看| 日韩精品一区二区三区蜜臀| 欧美三级资源在线| 色香蕉成人二区免费| 国产日韩欧美一区二区| 黄色av成人| 91浏览器在线视频| 99在线精品观看| 粉嫩绯色av一区二区在线观看| 精品一区二区成人精品| 五月婷婷色综合| 亚洲与欧洲av电影| 亚洲精品中文在线| 亚洲男人的天堂网| 成人欧美一区二区三区1314| 久久久99久久| 久久亚洲精品小早川怜子| 日韩视频在线你懂得| 4438亚洲最大| 亚洲va欧美va人人爽午夜 | 日韩主播视频在线| 亚洲图片欧美一区| 亚洲色图一区二区| 日本一区二区在线不卡| 久久免费的精品国产v∧| 欧美成人r级一区二区三区| 欧美一二三四区在线| 日韩欧美一区二区视频| 91精品国产综合久久久蜜臀粉嫩| 欧美日韩一级视频| 欧美高清hd18日本| 日本道色综合久久| 在线观看一区二区视频| 91精彩视频在线观看| 欧美一a一片一级一片| 色偷偷一区二区三区| 一本大道av伊人久久综合| 模特精品在线| 色系网站成人免费| 色欧美乱欧美15图片| 欧美日精品一区视频| 欧美日韩成人高清| 91精品久久久久久蜜臀| 日韩视频免费观看高清完整版| 日韩一区二区高清| 26uuu久久天堂性欧美| 久久精品视频一区二区三区| 亚洲国产精品二十页| 亚洲免费av观看| 亚洲一区二区欧美日韩 | 欧美黄色一级视频| 色综合视频在线观看| 欧美在线免费一级片| 午夜久久99| 最新国产乱人伦偷精品免费网站| 野花国产精品入口| 久久性天堂网| 欧美精品高清视频| 精品电影一区二区三区| 中文字幕乱码亚洲精品一区|