真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

讓客戶(hù)滿意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、舞陽(yáng)網(wǎng)站維護(hù)、網(wǎng)站推廣。

1、藍(lán)牙通信的主從關(guān)系

藍(lán)牙技術(shù)規(guī)定每一對(duì)設(shè)備之間進(jìn)行藍(lán)牙通訊時(shí),必須一個(gè)為主角色,另一為從角色,才能進(jìn)行通信,通信時(shí),必須由主端進(jìn)行查找,發(fā)起配對(duì),建鏈成功后,雙方即可收發(fā)數(shù)據(jù)。理論上,一個(gè)藍(lán)牙主端設(shè)備,可同時(shí)與7個(gè)藍(lán)牙從端設(shè)備進(jìn)行通訊。一個(gè)具備藍(lán)牙通訊功能的設(shè)備, 可以在兩個(gè)角色間切換,平時(shí)工作在從模式,等待其它主設(shè)備來(lái)連接,需要時(shí),轉(zhuǎn)換為主模式,向其它設(shè)備發(fā)起呼叫。一個(gè)藍(lán)牙設(shè)備以主模式發(fā)起呼叫時(shí),需要知道對(duì)方的藍(lán)牙地址,配對(duì)密碼等信息,配對(duì)完成后,可直接發(fā)起呼叫。

2、藍(lán)牙的呼叫過(guò)程

藍(lán)牙主端設(shè)備發(fā)起呼叫,首先是查找,找出周?chē)幱诳杀徊檎业乃{(lán)牙設(shè)備。主端設(shè)備找到從端藍(lán)牙設(shè)備后,與從端藍(lán)牙設(shè)備進(jìn)行配對(duì),此時(shí)需要輸入從端設(shè)備的PIN碼,也有設(shè)備不需要輸入PIN碼。配對(duì)完成后,從端藍(lán)牙設(shè)備會(huì)記錄主端設(shè)備的信任信息,此時(shí)主端即可向從端設(shè)備發(fā)起呼叫,已配對(duì)的設(shè)備在下次呼叫時(shí),不再需要重新配對(duì)。已配對(duì)的設(shè)備,做為從端的藍(lán)牙設(shè)備也可以發(fā)起建鏈請(qǐng)求,但做數(shù)據(jù)通訊的藍(lán)牙模塊一般不發(fā)起呼叫。鏈路建立成功后,主從兩端之間即可進(jìn)行雙向的數(shù)據(jù)或語(yǔ)音通訊。在通信狀態(tài)下,主端和從端設(shè)備都可以發(fā)起斷鏈,斷開(kāi)藍(lán)牙鏈路。

3、藍(lán)牙一對(duì)一的串口數(shù)據(jù)傳輸應(yīng)用

藍(lán)牙數(shù)據(jù)傳輸應(yīng)用中,一對(duì)一串口數(shù)據(jù)通訊是最常見(jiàn)的應(yīng)用之一,藍(lán)牙設(shè)備在出廠前即提前設(shè)好兩個(gè)藍(lán)牙設(shè)備之間的配對(duì)信息,主端預(yù)存有從端設(shè)備的PIN碼、地址等,兩端設(shè)備加電即自動(dòng)建鏈,透明串口傳輸,無(wú)需外圍電路干預(yù)。一對(duì)一應(yīng)用中從端設(shè)備可以設(shè)為兩種類(lèi)型,一是靜默狀態(tài),即只能與指定的主端通信,不被別的藍(lán)牙設(shè)備查找;二是開(kāi)發(fā)狀態(tài),既可被指定主端查找,也可以被別的藍(lán)牙設(shè)備查找建鏈。

功能概述

藍(lán)牙聊天功能主要分為以下幾個(gè)模塊:消息模塊、好友模塊以及個(gè)人模塊。

消息模塊

支持一對(duì)一、一對(duì)多、多對(duì)多實(shí)時(shí)聊天,能傳輸文字、表情、圖片、文件等。對(duì)方不在線時(shí)可支持離線消息發(fā)送,在對(duì)方在線時(shí)能及時(shí)推送過(guò)去。消息支持歷史消息存儲(chǔ)與查看。

好友模塊

支持附近好友添加,好友刪除,好友分組顯示,好友上下線提醒,好友昵稱(chēng)及分組名稱(chēng)修改。

個(gè)人模塊

展示個(gè)人信息,包含昵稱(chēng)、圖像、加入時(shí)間等信息。

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

該模塊還未實(shí)現(xiàn),目前實(shí)現(xiàn)功能主要有一對(duì)一實(shí)時(shí)聊天、能傳輸文字、表情、文件,支持好友添加、刪除、分組。下文主要介紹已經(jīng)實(shí)現(xiàn)的藍(lán)牙通信流程。

操作流程

查找已配對(duì)設(shè)備(即好友列表)

代碼實(shí)現(xiàn):

private void findDevice(){
 // 獲得已經(jīng)保存的配對(duì)設(shè)備
 Set pairedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
 if (pairedDevices.size() > 0) {
  mGroupFriendListData.clear();
  GroupInfo groupInfo = new GroupInfo();
  groupInfo.setGroupName(BluetoothAdapter.getDefaultAdapter().getName());
  List friendInfoList = new ArrayList<>();
  for (BluetoothDevice device : pairedDevices) {
   FriendInfo friendInfo = new FriendInfo();
   friendInfo.setIdentificationName(device.getName());
   friendInfo.setDeviceAddress(device.getAddress());
   friendInfo.setFriendNickName(device.getName());
   friendInfo.setOnline(false);
   friendInfo.setJoinTime(DateTime.getStringByFormat(new Date(), DateTime.DEFYMDHMS));
   friendInfo.setBluetoothDevice(device);
   friendInfoList.add(friendInfo);
  }
  groupInfo.setFriendList(friendInfoList);
  groupInfo.setOnlineNumber(0);
  mGroupFriendListData.add(groupInfo);
  mGroupFriendAdapter.setGroupInfoList(mGroupFriendListData);
 }
}

好友列表示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

啟用設(shè)備的可發(fā)現(xiàn)性

如果要讓本地設(shè)備可以被其他設(shè)備發(fā)現(xiàn),那么就要調(diào)用ACTION_REQUEST_DISCOVERABLE操作意圖的startActivityForResult(Intent, int)方法。這個(gè)方法會(huì)向系統(tǒng)設(shè)置發(fā)出一個(gè)啟用可發(fā)現(xiàn)模式的請(qǐng)求。默認(rèn)情況下,設(shè)備的可發(fā)現(xiàn)模式會(huì)持續(xù)120秒。通過(guò)給Intent對(duì)象添加EXTRA_DISCOVERABLE_DURATION附加字段,可以定義不同持續(xù)時(shí)間。應(yīng)用程序能夠設(shè)置的大持續(xù)時(shí)間是3600秒,0意味著設(shè)備始終是可發(fā)現(xiàn)的。任何小于0或大于3600秒的值都會(huì)自動(dòng)的被設(shè)為120秒。例如,以下代碼把持續(xù)時(shí)間設(shè)置為300秒:

Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);

申請(qǐng)用戶(hù)啟用設(shè)備的可發(fā)現(xiàn)模式時(shí),會(huì)顯示一個(gè)對(duì)話框。如果響應(yīng)“Yes”,那么設(shè)備的可發(fā)現(xiàn)模式會(huì)持續(xù)指定的時(shí)間,而且你的Activity會(huì)接收帶有結(jié)果代碼等于可發(fā)現(xiàn)設(shè)備持續(xù)時(shí)間的onActivityResult()回調(diào)方法的調(diào)用。如果用戶(hù)響應(yīng)“No”或有錯(cuò)誤發(fā)生,則結(jié)果代碼等于RESULT_CANCELED.

在可發(fā)現(xiàn)模式下,設(shè)備會(huì)靜靜的把這種模式保持到指定的時(shí)長(zhǎng)。如果你想要在可發(fā)現(xiàn)模式被改變時(shí)獲得通知,那么你可以注冊(cè)一個(gè)ACTION_SCAN_MODE_CHANGED類(lèi)型的Intent廣播。這個(gè)Intent對(duì)象中包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE附加字段,它們會(huì)分別告訴你新舊掃描模式。它們每個(gè)可能的值是:SCAN_MODE_CONNECTABLE_DISCOVERABLE,SCAN_MODE_CONNECTABLE或SCAN_MODE_NONE,它們分別指明設(shè)備是在可發(fā)現(xiàn)模式下,還是在可發(fā)現(xiàn)模式下但依然可接收連接,或者是在可發(fā)現(xiàn)模式下并不能接收連接。
如果你要初始化跟遠(yuǎn)程設(shè)備的連接,你不需要啟用設(shè)備的可現(xiàn)性。只有在你想要把你的應(yīng)用程序作為服務(wù)端來(lái)接收輸入連接時(shí),才需要啟用可發(fā)現(xiàn)性,因?yàn)檫h(yuǎn)程設(shè)備在跟你的設(shè)備連接之前必須能夠發(fā)現(xiàn)它。

搜索設(shè)備并進(jìn)行配對(duì)(即添加好友)

簡(jiǎn)單的調(diào)用startDiscovery()方法就可以開(kāi)始發(fā)現(xiàn)設(shè)備。該過(guò)程是異步的,并且該方法會(huì)立即返回一個(gè)布爾值來(lái)指明發(fā)現(xiàn)處理是否被成功的啟動(dòng)。通常發(fā)現(xiàn)過(guò)程會(huì)查詢(xún)掃描大約12秒,接下來(lái)獲取掃描發(fā)現(xiàn)的每個(gè)設(shè)備的藍(lán)牙名稱(chēng)。

public class ScanBroadcastReceiver extends BroadcastReceiver {

 private IScanCallback scanCallback;
 private final Map mDeviceMap = new HashMap<>();

 public ScanBroadcastReceiver(IScanCallback scanCallback) {
  this.scanCallback = scanCallback;
 }

 @Override
 public void onReceive(Context context, Intent intent) {
  if (scanCallback == null) {
   return;
  }
  if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
   //掃描到藍(lán)牙設(shè)備
   BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
   if (bluetoothDevice == null) {
    return;
   }
   if (!mDeviceMap.containsKey(bluetoothDevice.getAddress())) {
    mDeviceMap.put(bluetoothDevice.getAddress(), bluetoothDevice);
   }
   scanCallback.discoverDevice(bluetoothDevice);
  }else if(intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
   //掃描設(shè)備結(jié)束
   final List deviceList = new ArrayList<>(mDeviceMap.values());
   if(deviceList != null && deviceList.size() > 0){
    scanCallback.scanFinish(deviceList);
   } else{
    scanCallback.scanTimeout();
   }
  }
 }
}

搜索好友示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

public class PairBroadcastReceiver extends BroadcastReceiver {

 private IPairCallback pairCallback;

 public PairBroadcastReceiver(IPairCallback pairCallback) {
  this.pairCallback = pairCallback;
 }

 @Override
 public void onReceive(Context context, Intent intent) {
  if(intent.getAction().equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)){
   //取得狀態(tài)改變的設(shè)備,更新設(shè)備列表信息(配對(duì)狀態(tài))
   BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
   if(device != null){
    resolveBondingState(device.getBondState());
   }
  }
 }

 private void resolveBondingState(final int bondState) {
  if (pairCallback == null) {
   return;
  }
  switch (bondState) {
   case BluetoothDevice.BOND_BONDED://已配對(duì)
    pairCallback.bonded();
    break;
   case BluetoothDevice.BOND_BONDING://配對(duì)中
    pairCallback.bonding();
    break;
   case BluetoothDevice.BOND_NONE://未配對(duì)
    pairCallback.unBonded();
    break;
   default:
    pairCallback.bondFail();
    break;
  }
 }
}

配對(duì)信息示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

配對(duì)過(guò)程示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

連接設(shè)備(即好友建立通信通道)

當(dāng)你想要連接兩個(gè)設(shè)備時(shí),一個(gè)必須通過(guò)持有一個(gè)打開(kāi)的BluetoothServerSocket對(duì)象來(lái)作為服務(wù)端。服務(wù)套接字的用途是監(jiān)聽(tīng)輸入的連接請(qǐng)求,并且在一個(gè)連接請(qǐng)求被接收時(shí),提供一個(gè)BluetoothSocket連接對(duì)象。在從BluetoothServerSocket對(duì)象中獲取BluetoothSocket時(shí),BluetoothServerSocket能夠(并且也應(yīng)該)被廢棄,除非你想要接收更多的連接。
以下是建立服務(wù)套接字和接收一個(gè)連接的基本過(guò)程:

1、調(diào)用listenUsingRfcommWithServiceRecord(String, UUID)方法來(lái)獲得一個(gè)BluetoothServerSocket對(duì)象。該方法中的String參數(shù)是一個(gè)可識(shí)別的你的服務(wù)端的名稱(chēng),系統(tǒng)會(huì)自動(dòng)的把它寫(xiě)入設(shè)備上的Service Discovery Protocol(SDP)數(shù)據(jù)庫(kù)實(shí)體(該名稱(chēng)是任意的,并且可以簡(jiǎn)單的使用你的應(yīng)用程序的名稱(chēng))。UUID參數(shù)也會(huì)被包含在SDP實(shí)體中,并且是跟客戶(hù)端設(shè)備連接的基本協(xié)議。也就是說(shuō),當(dāng)客戶(hù)端嘗試跟服務(wù)端連接時(shí),它會(huì)攜帶一個(gè)它想要連接的服務(wù)端能夠唯一識(shí)別的UUID。只有在這些UUID完全匹配的情況下,連接才可能被接收。

2、通過(guò)調(diào)用accept()方法,啟動(dòng)連接請(qǐng)求。這是一個(gè)阻塞調(diào)用。只有在連接被接收或發(fā)生異常的情況下,該方法才返回。只有在發(fā)送連接請(qǐng)求的遠(yuǎn)程設(shè)備所攜帶的UUID跟監(jiān)聽(tīng)服務(wù)套接字所注冊(cè)的一個(gè)UUID匹配的時(shí)候,該連接才被接收。連接成功,accept()方法會(huì)返回一個(gè)被連接的BluetoothSocket對(duì)象。

3、除非你想要接收其他連接,否則要調(diào)用close()方法。該方法會(huì)釋放服務(wù)套接字以及它所占用的所有資源,但不會(huì)關(guān)閉被連接的已經(jīng)有accept()方法所返回的BluetoothSocket對(duì)象。跟TCP/IP不一樣,每個(gè)RFCOMM通道一次只允許連接一個(gè)客戶(hù)端,因此在大多數(shù)情況下,在接收到一個(gè)連接套接字之后,立即調(diào)用BluetoothServerSocket對(duì)象的close()方法是有道理的。

以下是以上過(guò)程實(shí)現(xiàn)的監(jiān)聽(tīng)線程:

public class AcceptThread extends Thread {

 private BluetoothChatHelper mHelper;
 private final BluetoothServerSocket mServerSocket;
 private String mSocketType;

 public AcceptThread(BluetoothChatHelper bluetoothChatHelper, boolean secure) {
  mHelper = bluetoothChatHelper;
  BluetoothServerSocket tmp = null;
  mSocketType = secure ? "Secure" : "Insecure";

  try {
   if (secure) {
    tmp = mHelper.getAdapter().listenUsingRfcommWithServiceRecord(ChatConstant.NAME_SECURE, ChatConstant.UUID_SECURE);
   } else {
    tmp = mHelper.getAdapter().listenUsingInsecureRfcommWithServiceRecord(ChatConstant.NAME_INSECURE, ChatConstant.UUID_INSECURE);
   }
  } catch (IOException e) {
   BleLog.e("Socket Type: " + mSocketType + "listen() failed", e);
  }
  mServerSocket = tmp;
 }

 public void run() {
  BleLog.i("Socket Type: " + mSocketType + "BEGIN mAcceptThread" + this);
  setName("AcceptThread" + mSocketType);

  BluetoothSocket socket = null;

  while (mHelper.getState() != com.vise.basebluetooth.common.State.STATE_CONNECTED) {
   try {
    BleLog.i("wait new socket:" + mServerSocket);
    socket = mServerSocket.accept();
   } catch (IOException e) {
    BleLog.e("Socket Type: " + mSocketType + " accept() failed", e);
    break;
   }
   if (socket != null) {
    synchronized (this) {
     if(mHelper.getState() == com.vise.basebluetooth.common.State.STATE_LISTEN
       || mHelper.getState() == com.vise.basebluetooth.common.State.STATE_CONNECTING){
      BleLog.i("mark CONNECTING");
      mHelper.connected(socket, socket.getRemoteDevice(), mSocketType);
     } else if(mHelper.getState() == com.vise.basebluetooth.common.State.STATE_NONE
       || mHelper.getState() == com.vise.basebluetooth.common.State.STATE_CONNECTED){
      try {
       socket.close();
      } catch (IOException e) {
       BleLog.e("Could not close unwanted socket", e);
      }
     }
    }
   }
  }
  BleLog.i("END mAcceptThread, socket Type: " + mSocketType);
 }

 public void cancel() {
  BleLog.i("Socket Type" + mSocketType + "cancel " + this);
  try {
   mServerSocket.close();
  } catch (IOException e) {
   BleLog.e("Socket Type" + mSocketType + "close() of server failed", e);
  }
 }
}

以下是一個(gè)基本的連接過(guò)程:

1、通過(guò)調(diào)用BluetoothDevice的createRfcommSocketToServiceRecord(UUID)方法,獲得一個(gè)BluetoothSocket對(duì)象。這個(gè)方法會(huì)初始化一個(gè)連接到BluetoothDevice對(duì)象的BluetoothSocket對(duì)象。傳遞給這個(gè)方法的UUID參數(shù)必須與服務(wù)端設(shè)備打開(kāi)BluetoothServerSocket對(duì)象時(shí)所使用的UUID相匹配。在你的應(yīng)用程序中簡(jiǎn)單的使用硬編碼進(jìn)行比對(duì),如果匹配,服務(wù)端和客戶(hù)端代碼就可以應(yīng)用這個(gè)BluetoothSocket對(duì)象了。

2、通過(guò)調(diào)用connect()方法來(lái)初始化連接。在這個(gè)調(diào)用中,為了找到匹配的UUID,系統(tǒng)會(huì)在遠(yuǎn)程的設(shè)備上執(zhí)行一個(gè)SDP查詢(xún)。如果查詢(xún)成功,并且遠(yuǎn)程設(shè)備接收了該連接請(qǐng)求,那么它會(huì)在連接期間共享使用RFCOMM通道,并且connect()方法會(huì)返回。這個(gè)方法是一個(gè)阻塞調(diào)用。如果因?yàn)槟承┰?,連接失敗或連接超時(shí)(大約在12秒之后),就會(huì)拋出一個(gè)異常。

以下是實(shí)現(xiàn)以上過(guò)程的連接線程:

public class ConnectThread extends Thread {

 private BluetoothChatHelper mHelper;
 private final BluetoothSocket mSocket;
 private final BluetoothDevice mDevice;
 private String mSocketType;

 public ConnectThread(BluetoothChatHelper bluetoothChatHelper, BluetoothDevice device, boolean secure) {
  mHelper = bluetoothChatHelper;
  mDevice = device;
  BluetoothSocket tmp = null;
  mSocketType = secure ? "Secure" : "Insecure";

  try {
   if (secure) {
    tmp = device.createRfcommSocketToServiceRecord(ChatConstant.UUID_SECURE);
   } else {
    tmp = device.createInsecureRfcommSocketToServiceRecord(ChatConstant.UUID_INSECURE);
   }
  } catch (IOException e) {
   BleLog.e("Socket Type: " + mSocketType + "create() failed", e);
  }
  mSocket = tmp;
 }

 public void run() {
  BleLog.i("BEGIN mConnectThread SocketType:" + mSocketType);
  setName("ConnectThread" + mSocketType);

  mHelper.getAdapter().cancelDiscovery();

  try {
   mSocket.connect();
  } catch (IOException e) {
   try {
    mSocket.close();
   } catch (IOException e2) {
    BleLog.e("unable to close() " + mSocketType + " socket during connection failure", e2);
   }
   mHelper.connectionFailed();
   return;
  }

  synchronized (this) {
   mHelper.setConnectThread(null);
  }

  mHelper.connected(mSocket, mDevice, mSocketType);
 }

 public void cancel() {
  try {
   mSocket.close();
  } catch (IOException e) {
   BleLog.e("close() of connect " + mSocketType
     + " socket failed", e);
  }
 }
}

在建立連接之前要調(diào)用cancelDiscovery()方法。在連接之前應(yīng)該始終調(diào)用這個(gè)方法,并且不用實(shí)際的檢查藍(lán)牙發(fā)現(xiàn)處理是否正在運(yùn)行也是安全的(如果想要檢查,調(diào)用isDiscovering()方法)。

管理連接(即好友間通信)

當(dāng)你成功的連接了兩個(gè)(或更多)設(shè)備時(shí),每一個(gè)設(shè)備都有一個(gè)被連接的BluetoothSocket對(duì)象。這是良好的開(kāi)始,因?yàn)槟隳軌蛟谠O(shè)備之間共享數(shù)據(jù)。使用BluetoothSocket對(duì)象來(lái)傳輸任意數(shù)據(jù)的過(guò)程是簡(jiǎn)單的:

1、分別通過(guò)getInputStream()和getOutputStream()方法來(lái)獲得通過(guò)套接字來(lái)處理傳輸任務(wù)的InputStream和OutputStream對(duì)象;

2、用read(byte[])和write(byte[])方法來(lái)讀寫(xiě)流中的數(shù)據(jù)。

以下為實(shí)現(xiàn)以上過(guò)程的通信線程:

public class ConnectedThread extends Thread {

 private final BluetoothChatHelper mHelper;
 private final BluetoothSocket mSocket;
 private final InputStream mInStream;
 private final OutputStream mOutStream;

 public ConnectedThread(BluetoothChatHelper bluetoothChatHelper, BluetoothSocket socket, String socketType) {
  BleLog.i("create ConnectedThread: " + socketType);
  mHelper = bluetoothChatHelper;
  mSocket = socket;
  InputStream tmpIn = null;
  OutputStream tmpOut = null;

  try {
   tmpIn = socket.getInputStream();
   tmpOut = socket.getOutputStream();
  } catch (IOException e) {
   BleLog.e("temp sockets not created", e);
  }

  mInStream = tmpIn;
  mOutStream = tmpOut;
 }

 public void run() {
  BleLog.i("BEGIN mConnectedThread");
  int bytes;
  byte[] buffer = new byte[1024];

  // Keep listening to the InputStream while connected
  while (true) {
   try {
    bytes = mInStream.read(buffer);
    byte[] data = new byte[bytes];
    System.arraycopy(buffer, 0, data, 0, data.length);
    mHelper.getHandler().obtainMessage(ChatConstant.MESSAGE_READ, bytes, -1, data).sendToTarget();
   } catch (IOException e) {
    BleLog.e("disconnected", e);
    mHelper.start(false);
    break;
   }
  }
 }

 public void write(byte[] buffer) {
  if(mSocket.isConnected()){
   try {
    mOutStream.write(buffer);
    mHelper.getHandler().obtainMessage(ChatConstant.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();
   } catch (IOException e) {
    BleLog.e("Exception during write", e);
   }
  }
 }

 public void cancel() {
  try {
   mSocket.close();
  } catch (IOException e) {
   BleLog.e("close() of connect socket failed", e);
  }
 }
}

發(fā)送消息示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

發(fā)送表情示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

發(fā)送文件示例圖:

怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天

看完上述內(nèi)容,你們對(duì)怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)站名稱(chēng):怎么在Android中實(shí)現(xiàn)藍(lán)牙聊天-創(chuàng)新互聯(lián)
本文地址:http://weahome.cn/article/ddehci.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部