`
445822357
  • 浏览: 734739 次
文章分类
社区版块
存档分类
最新评论

Android 蓝牙开发详述

 
阅读更多

转自:http://blog.csdn.net/einarzhang/article/details/6943861


在AndroidSDK sample中给出了一个蓝牙聊天的示例代码,本文只是略作修改变成一个简单的服务器和客户端模式的应用,以适应在游戏开发中一对一关联的数据传输。

由于游戏中的蓝牙设置在新线程中发生,所以采用Handler的方式将蓝牙的状态以及读取信息传输给显示Activity。

1 开启蓝牙,包括xml中的配置:

  1. <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
  2. <uses-permissionandroid:name="android.permission.BLUETOOTH"/>


  1. //获取蓝牙适配器
  2. BluetoothAdapterbtAdapter=BlueToothService.getInstance().getBtAdapter();
  3. //开启蓝牙
  4. if(!btAdapter.isEnabled()){
  5. IntentenableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
  6. startActivityForResult(enableIntent,ConstantsUtil.ENABLE_BLUETOOTH);
  7. }


2 在当前Activity中获取蓝牙开启结果,并根据具体情况对蓝牙进行处理

  1. @Override
  2. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  3. switch(requestCode){
  4. caseConstantsUtil.ENABLE_BLUETOOTH:
  5. if(resultCode==Activity.RESULT_OK){
  6. bluetoothProcess(PSystem.isServer);
  7. }else{
  8. finish();
  9. }
  10. }
  11. }
  12. publicvoidbluetoothProcess(booleanisServer){
  13. BlueToothService.getInstance().setsHandler(mHandler);
  14. if(isServer){
  15. //如果是蓝牙服务器,则需要开启发现服务,并启动蓝牙服务器
  16. if(btAdapter.getScanMode()!=BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE){
  17. IntentdiscoverableIntent=newIntent(
  18. BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
  19. discoverableIntent.putExtra(
  20. BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,180);
  21. startActivity(discoverableIntent);
  22. }
  23. BlueToothService.getInstance().start();
  24. }else{
  25. //如果是蓝牙客户端则扫描周围可用的蓝牙设备
  26. blueToothNames=newArrayList<String>();
  27. blutToothDevices=newArrayList<BluetoothDevice>();
  28. //添加过滤器,并注册广播,用于监听蓝牙发现信息
  29. IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);
  30. this.registerReceiver(mReceiver,filter);
  31. filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  32. this.registerReceiver(mReceiver,filter);
  33. //开始扫描
  34. doDiscovery();
  35. }
  36. }
  37. publicvoiddoDiscovery(){
  38. if(btAdapter.isDiscovering()){
  39. btAdapter.cancelDiscovery();
  40. }
  41. btAdapter.startDiscovery();
  42. }


3 蓝牙广播接收器

  1. privatefinalBroadcastReceivermReceiver=newBroadcastReceiver(){
  2. @Override
  3. publicvoidonReceive(Contextcontext,Intentintent){
  4. Stringaction=intent.getAction();
  5. if(BluetoothDevice.ACTION_FOUND.equals(action)){
  6. BluetoothDevicedevice=intent
  7. .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  8. if(device.getName()!=null&&!device.getName().trim().equals("")){
  9. blueToothNames.add(device.getName());
  10. blutToothDevices.add(device);
  11. }
  12. }elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
  13. .equals(action)){
  14. btAdapter.cancelDiscovery();
  15. TestActivity.this.unregisterReceiver(this);
  16. }
  17. }
  18. };


4 以上是蓝牙基本配置和发现。现在进行蓝牙监听和连接:

蓝牙服务器监听代码:

  1. publicvoidstart(){
  2. BluetoothServerSocketserverSocket=null;
  3. try{
  4. serverSocket=btAdapter.listenUsingRfcommWithServiceRecord("JumpForMeApp",MY_UUID_SECURE);
  5. changeState(ConstantsUtil.BT_STATE_LISTEN);
  6. btSocket=serverSocket.accept();
  7. }catch(IOExceptione){
  8. }finally{
  9. try{
  10. serverSocket.close();
  11. }catch(IOExceptione){
  12. }
  13. }
  14. if(btSocket!=null){
  15. changeState(ConstantsUtil.BT_STATE_CONNECTED);
  16. }
  17. }

客户端连接代码:

  1. publicvoidconnect(BluetoothDevicedevice){
  2. try{
  3. btAdapter.cancelDiscovery();
  4. btSocket=device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
  5. changeState(ConstantsUtil.BT_STATE_CONNECTING);
  6. btSocket.connect();
  7. }catch(IOExceptione){
  8. }
  9. changeState(ConstantsUtil.BT_STATE_CONNECTED);
  10. }


5利用蓝牙进行消息传递,建立新的线程来处理读写操作(见BluetoothChat Sample中的ConnectedThread):

  1. classConnectedThreadextendsThread{
  2. privatefinalBluetoothSocketmmSocket;
  3. privatefinalInputStreammmInStream;
  4. privatefinalOutputStreammmOutStream;
  5. publicConnectedThread(BluetoothSocketsocket){
  6. mmSocket=socket;
  7. InputStreamtmpIn=null;
  8. OutputStreamtmpOut=null;
  9. try{
  10. tmpIn=socket.getInputStream();
  11. tmpOut=socket.getOutputStream();
  12. }catch(IOExceptione){
  13. Log.e(TAG,"tempsocketsnotcreated",e);
  14. }
  15. mmInStream=tmpIn;
  16. mmOutStream=tmpOut;
  17. }
  18. publicvoidrun(){
  19. byte[]buffer=newbyte[1024];
  20. intbytes;
  21. while(true){
  22. try{
  23. bytes=mmInStream.read(buffer);
  24. if(transHandler!=null){
  25. //通知数据传输处理器
  26. transHandler.sendMessage(transHandler.obtainMessage(ConstantsUtil.BT_READ,bytes,-1,buffer));
  27. }
  28. }catch(IOExceptione){
  29. Log.e(TAG,"disconnected",e);
  30. break;
  31. }
  32. }
  33. }
  34. publicvoidwrite(byte[]buffer){
  35. try{
  36. mmOutStream.write(buffer);
  37. }catch(IOExceptione){
  38. Log.e(TAG,"Exceptionduringwrite",e);
  39. }
  40. }
  41. publicvoidcancel(){
  42. try{
  43. mmSocket.close();
  44. }catch(IOExceptione){
  45. Log.e(TAG,"close()ofconnectsocketfailed",e);
  46. }
  47. }
  48. }

分享到:
评论

相关推荐

    蓝牙技术详述.pdf

    蓝牙技术详述,很经典的书籍,对蓝牙的协议栈进行了详细的分析。

    c#开发Android应用实战

    《C#开发Android应用实战——使用Mono for Android和.NET/C# 全面透彻地讲解Android应用编程知识,分析如何结合使用C#和Mono来编写在Android设备系列上运行的应用程序。在这本由多位专家联袂撰写的必备精品书籍的...

    Android Provider用法详述

    刚刚做完一个项目,自己总结的Provider用法。

    android Activity 详述 demo

    android Activity 详述 demo 具体博文: http://blog.csdn.net/q610098308/article/details/50057927

    Android NDK开发指南-android.mk文件

    android.mk文件语法详述及简单实例

    Android开发应用从入门到精通光盘

    Android开发应用从入门到精通 朱桂英 中国铁道出版社 本书循序渐进地讲解了android技术的基本知识,并通过实例直观地演示了android在各个领域中的具体应用。本书内容新颖、知识全面、讲解详细,全书分为4篇17章,第...

    教您如何在Linux下配置Java开发环境详述

    教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux下配置Java开发环境详述教您如何在Linux...

    FineReport报表二次开发详述

    java编写的FineReport报表进行二次开发

    Linux系统下配置Java开发环境详述

    Linux系统下配置Java开发环境详述

    Android 4高级编程(第3版)

    本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...

    使用FineReport报表二次开发详述

    在大多数情况下FineReport都可以完全满足用户制作各种报表的需求,但是为了能够满足个别用户的个性化需求,FineReport提供了丰富二次开发接口,方便用户将FineReport和自己的项目实现无缝结合,用户在进行二次开发的...

    Android 4高级编程(第3版)源代码

    本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...

    Android 4高级编程(第3版).pdf 高清

    《Android 4高级编程(第3版)》见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助此入门。作为一本以实用性为目的的指导图书,...

    详述VOIP基础 --详述VOIP基础

    详述VOIP基础详述VOIP基础详述VOIP基础详述VOIP基础详述VOIP基础

    Spring MVC 开发一般步骤详述

    本人将Spring MVC的一般开发步骤做了一个详细的记录 有相关截图 相关核心代码 为懂各个java代码但是不会整合开发的朋友提供一个借鉴 希望朋友们看了文档后能够达到用java做系统全程开发的能力 主要涉及的内容有以下...

    游戏开发流程详述

    整个游戏开发流程的详细介绍,包括所有步骤。

    如何在Linux下配置Java开发环境详述

    如何在Linux下配置Java开发环境详述,相当经典。

    Linux下配置Java开发环境详述[文].pdf

    Linux下配置Java开发环境详述[文].pdf

    Android 4高级编程(第3版).part1

    本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...

    Android 4高级编程(第3版).part2

    本书见解深刻,帮助经验丰富的Android开发人员充分挖掘Android 4的新特性的潜力,同时讲解了Android开发的基础知识,使初学者也可以借助本书入门。作为一本以实用性为目的的指导图书,本书带领您逐步完成复杂程度...

Global site tag (gtag.js) - Google Analytics