最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現一對一藍牙聊天APP

 更新時間:2018年06月02日 13:28:50   作者:yangxlAndroid  
這篇文章主要為大家詳細介紹了Android實現一對一藍牙聊天APP,具有一定的參考價值,感興趣的小伙伴們可以參考一下

學習了,三天的Android 藍牙開發(fā),開始是一頭霧水,看著別人講的Google官方的demo感覺很容易,所有自己也嘗試寫一個很簡單的聊天demo.可是想的很簡單,自己做起來也花了,將近一天的時間才搞定這個基本的流程設計.下面是幾點心得后面再貼代碼

1)寫一個簡單的demo也好,記得一定需要有總體的流程,才開始摳代碼
2)既然是demo畢竟就是新的知識,代碼中間的log點一定\不能少,這是你快速調試的利器
3)還是thinking in java 里面的那句話,思考什么是可變的,什么是不可變的,然后分開,這樣來實現代碼的封裝,感覺很不錯了.只是現在感覺還是很難想明白
4)開始思考以面向對象的流程處理問題,需要怎么弄,也是封裝代碼的一種思想

藍牙聊天的基本功能:

1.實現一對一藍牙連接
2.實現一對一聊天

很簡單的功能,思路看著也很清晰,可是深入去寫,才知道,水還是深度的,java不熟的話.
此處基本的如何打開藍牙不在復述,請自行百度.

思路:

1)初始化,打開手機的藍牙,開始藍牙服務器線程,等待連接
2)配對,獲取某臺手機的藍牙address地址.
3)開啟連接線程連接手機藍牙
4)連接成功后,開啟,藍牙聊天的線程,進行聊天的通訊.

上面四步是主要思路,其中存在著幾個細節(jié)的地方,就是在開發(fā)中某些邏輯問題,線程間的安全問題,也是需要好好處理的. 讓我感受比較深的地方是,一對一聊天,相當于,首相每臺機器都可能作為服務器在進行通訊,所以一開始開啟了兩個服務監(jiān)聽,一旦有一個接入進來,這里需要弄清楚哪個是接入對象,哪個是被接入對象, 沒有作為服務端的,可以把服務端線程關閉掉。

下面貼點代碼

/**
 * 客戶端啟動連接線程
 * 通過藍牙的mac地址獲取連接
 * @author Administrator
 *
 */
 private class ConnectThread extends Thread {

 private BluetoothDevice mDevice;
 private BluetoothSocket btSocket = null;

 public ConnectThread(String address) {
  // TODO Auto-generated constructor stub
  mDevice = mBluetoothAdapter.getRemoteDevice(address);
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  connect(mDevice);
 }

 private void connect(BluetoothDevice btDev) {

  Method creMethod;
  try {
  creMethod = BluetoothDevice.class.getMethod("createBond");
  creMethod.invoke(btDev);

  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  try {
  btSocket = btDev.createRfcommSocketToServiceRecord(MYUUID);
  System.out.println("========" + "start connect");
  Log.d("BlueToothTestActivity", "開始連接...");
  btSocket.connect();
  mClientSocket = btSocket;
  isConnected=true;
  mHandler.sendEmptyMessage(SUCCESS_SERVICE_BEGIN_TALKING);

  // 作為客戶端 關閉 服務端 等待的鏈接
  if (acceptThread != null) {
   acceptThread.close();
  }
  startTalk();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  System.out.println("???????????????? close socket");
  close();
  System.out.println(e.toString());
  e.printStackTrace();
  }

 }

 private void close() {
  if (btSocket != null) {
  try {
   btSocket.close();
   mHandler.sendEmptyMessage(FAILED_SERVICE_SOCRCKET);
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  }
 }

}
/**
 * 服務端的設計
 * 每個藍牙的客戶端先要開啟服務端等待接入
 * @author Administrator
 *
*/
 private class AcceptThread extends Thread {
 private final BluetoothServerSocket mmServerSocket;

 public AcceptThread() {
  // Use a temporary object that is later assigned to mmServerSocket,
  // because mmServerSocket is final
  BluetoothServerSocket tmp = null;
  try {
  // MY_UUID is the app's UUID string, also used by the client
  // code
  tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("Fisrt", MYUUID);
  } catch (IOException e) {
  mHandler.sendEmptyMessage(FAILED_SERVICE_SOCRCKET);

  }
  mmServerSocket = tmp;
 }

 public void run() {
  BluetoothSocket socket = null;
  // Keep listening until exception occurs or a socket is returned
  while (isRun) {
  try {
   socket = mmServerSocket.accept();
   mHandler.sendEmptyMessage(SUCCESS_SERVICE_SOCRCKET);

   Log.e("TAG", "========== server start ====");

  } catch (IOException e) {
   mHandler.sendEmptyMessage(FAILED_SERVICE_SOCRCKET);
   close();
  }



  // If a connection was accepted
  if (socket != null) {
   // 服務端連接成功,啟動聊天線程,通過 同一個 socket 防止多線程賦值出現空值的問題
   isConnected=true;
   mClientSocket = socket;
   mTalkThread = new TalkThread();
   mTalkThread.start();

   // Do work to manage the connection (in a separate thread)
   // 多線程操作小心不安全性
   synchronized (BlueConnectService.this) {
   //close();
   }
  }

  }
 }

 public void close() {
  isRun = false;
  try {
  mmServerSocket.close();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }

}
/**
 *設計連接成功后的聊天線程 1.建立流,打通連接 2.發(fā)送和接收數據 3.顯示數據
 *需要注意的是聊天的時候,需要同一個socket建立連接才能獲取對應的輸入輸出流
 */

 private class TalkThread extends Thread {

 private final BluetoothSocket talkSocket;
 private final InputStream mIs;
 private final OutputStream mOs;
 private boolean isRunning = true;

 public TalkThread() {
  // TODO Auto-generated constructor stub
  talkSocket = mClientSocket;
  if (talkSocket == null) {
  System.out.println("================= talkThread erro ");
  // return;
  }

  InputStream is = null;
  OutputStream os = null;
  try {
  is = talkSocket.getInputStream();
  os = talkSocket.getOutputStream();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  try {
   System.out.println("???????????????? close socket");
   talkSocket.close();
   CloseUtil.closeStream(is, os);
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  e.printStackTrace();
  }

  mIs = is;
  mOs = os;

 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  super.run();
  byte[] buffer = new byte[1024];
  int len;
  while (isRunning) {
  try {
   len = mIs.read(buffer);
   mHandler.obtainMessage(READ_MESSAGE, len, -1, buffer).sendToTarget();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   try {
   isRunning = false;
   isConnected=false;
   System.out.println("???????????????? close socket");
   talkSocket.close();
   // 需要重啟服務器
   // 啟動服務器

   } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
   }
   CloseUtil.closeStream(mIs, mOs);

  }
  }

 }

 public void write(byte[] bytes) {
  try {
  mOs.write(bytes);
  mHandler.obtainMessage(WRITE_MESSAGE, bytes.length, -1, bytes).sendToTarget();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android編程實現小說閱讀器滑動效果的方法

    Android編程實現小說閱讀器滑動效果的方法

    這篇文章主要介紹了Android編程實現小說閱讀器滑動效果的方法,涉及onTouch事件滑動效果的相關實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 新版Flutter集成到已有Android項目的實現

    新版Flutter集成到已有Android項目的實現

    這篇文章主要介紹了新版Flutter集成到已有Android項目的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Android開發(fā)實現讀取assets目錄下db文件的方法示例

    Android開發(fā)實現讀取assets目錄下db文件的方法示例

    這篇文章主要介紹了Android開發(fā)實現讀取assets目錄下db文件的方法,結合實例形式分析了Android針對assets目錄下SQLite數據庫文件的相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android編程實現滑動按鈕功能詳解

    Android編程實現滑動按鈕功能詳解

    這篇文章主要介紹了Android編程實現滑動按鈕功能,結合實例形式較為詳細的分析了Android實現滑動按鈕的功能、布局及相關注意事項,需要的朋友可以參考下
    2017-02-02
  • Android Studio EditText點擊圖標清除文本內容的實例解析

    Android Studio EditText點擊圖標清除文本內容的實例解析

    這篇文章主要介紹了Android Studio EditText點擊圖標清除文本內容的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • 分享一個Android設置圓形圖片的特別方法

    分享一個Android設置圓形圖片的特別方法

    圓形圖片想必是項目開發(fā)中也是不少用的一個知識點吧。那么這里學習一下簡單的制作圓形圖片,這個方法不用于平時的實現方法,有需要的可以參考借鑒。
    2016-09-09
  • 如何在WorkManager中處理異步任務詳解

    如何在WorkManager中處理異步任務詳解

    這篇文章主要給大家介紹了關于如何在WorkManager中處理異步任務的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • Android 控制wifi 相關操作實例

    Android 控制wifi 相關操作實例

    本篇文章主要介紹了Android 控制wifi 的開發(fā)實例,并附有實例源碼等相關資料,需要的朋友可以參考下
    2016-07-07
  • Kotlin?ContentProvider使用方法詳解

    Kotlin?ContentProvider使用方法詳解

    ContentProvider內容提供者,主要用于再不同的應用程序之前實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另外一個程序的數據,同時還能保證數據的安全性
    2022-12-12
  • Android實現仿iOS菊花加載圈動畫效果

    Android實現仿iOS菊花加載圈動畫效果

    iOS上有一個UIActivityIndicator的控件,就是俗稱轉菊花的控件,一般UI設計師會按照iOS的風格來出設計稿,也要求使用這種Loading效果,本文將具體的講述如何實現這種效果,感興趣的朋友可以參考下
    2021-05-05

最新評論

仙桃市| 五原县| 界首市| 宕昌县| 黑水县| 襄垣县| 邻水| 湘潭县| 山东| 乐都县| 淄博市| 泾源县| 萍乡市| 酒泉市| 依兰县| 广宁县| 巴马| 阿城市| 武义县| 中超| 溧水县| 丰顺县| 遂平县| 英山县| 甘肃省| 如东县| 义乌市| 郧西县| 涟水县| 大名县| 吉隆县| 麻江县| 汉中市| 夏河县| 郧西县| 农安县| 东乌珠穆沁旗| 旌德县| 兰考县| 东山县| 六安市|