Android中蓝牙的基本使用----BluetoothAdapter类简介

原文http://blog.csdn.net/qinjuning



     天气逐渐热了,自己也越来越懒了,虽然看着了很多东西,解决了很多问题,有些收获却不想写着。主要有一下两方面原因:

  

         第一、以前写的一些关于Android知识的Blog,都是在学习过程中发现网络上没有相关知识,因此下了很大决心,才一步

                一步码字儿给贴出来。承蒙各位网友的厚爱,本博客还是有些底子的。

         第二、最近的工作态度发生了改变,不在像那么以前充满热情,充满力量,就着问题解决问题,自己都有点耐烦了。心里

                寻思着,也许是该改变些什么了吧。

 

      新的手机项目,又开始从事之前的Settings模块了,现在看看Settings模块,没有了最开始的那种心虚,还是觉得挺熟悉的。

  就是代码量太多了,看着有点头大。

 

      好吧。我们废话就介绍到此了,下面开始正文。本节主要介绍蓝牙—BluetoothAdapter的一些基本应用,一些简单的Android 

  API的使用。

 

 

   一、 BluetoothAdapter类介绍

 

        BluetoothAdapter类简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本

    开发了,主要有如下功能:

             1、开关蓝牙设备

             2、扫描蓝牙设备

             3、设置/获取蓝牙状态信息,例如:蓝牙状态值、蓝牙Name、蓝牙Mac地址等;

 

 

     由于网络上关于BluetoothAdapter的一些常用API函数都有了介绍,因此,我着重介绍一些BluetoothAdapter类疏忽的地方。

 

     1、BluetoothAdapter STATE 状态值 , 即开关状态


              int STATE_OFF        蓝牙已经关闭

              int STATE_ON        蓝牙已经打开

              int STATE_TURNING_OFF      蓝牙处于关闭过程中 ,关闭ing

              int STATE_TURNING_ON        蓝牙处于打开过程中 ,打开ing

 

            


                  上图中 , 红色线路图表示蓝牙由关闭状态 转向为打开状态的过程 ;

                                 蓝色线路图表示蓝牙由打开状态 转向为关闭状态的过程 ;

 


    2、BluetoothAdapter  SCAN_MOD状态值 ,即扫描状态

            首先说明,可以扫描其他设备的,当然它同时能被其他蓝牙设备扫码。

 

         int  SCAN_MODE_CONNECTABLE         表明该蓝牙可以扫描其他蓝牙设备

         int  SCAN_MODE_CONNECTABLE_DISCOVERABLE    

                        表 明该蓝牙设备同时可以扫码其他蓝牙设备,并且可以被其他蓝牙设备扫描到。

         int  SCAN_MODE_NONE : 该蓝牙不能扫描以及被扫描。

 

    3、获得蓝牙适配器实例

  

       public static synchronized BluetoothAdapter getDefaultAdapter ()

           功能:获得本设备的蓝牙适配器实例。

           返回值:如果设备具备蓝牙功能,返回BluetoothAdapter 实例;否则,返回null对象。

 

 

    4、打开/关闭蓝牙的两种方法:

 

         4.1、打开蓝牙:

            ①、直接调用函数enable()去打开蓝牙设备 ;

            ②、系统API去打开蓝牙设备,该方式会弹出一个对话框样式的Activity供用户选择是否打开蓝牙设备。

                    注意:如果蓝牙已经开启,不会弹出该Activity界面。

 

        PS:在目前Android手机中,是不支持在飞行模式下开启蓝牙的。如果蓝牙已经开启,那么蓝牙的开关状态会随着飞行模式

 的状态而发生改变。

 

       代码示例分别如下:

 

[java]  view plain  copy
 print ?
  1. //第一种打开方法: 调用enable 即可  
  2. boolean result = mBluetoothAdapter.enable();  
  3.   
  4. //  
  5. /第二种打开方法 ,调用系统API去打开蓝牙  
  6. if (!mBluetoothAdapter.isEnabled()) //未打开蓝牙,才需要打开蓝牙  
  7. {  
  8. Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
  9. startActivityForResult(intent, REQUEST_OPEN_BT_CODE);  
  10. //会以Dialog样式显示一个Activity , 我们可以在onActivityResult()方法去处理返回值  
  11. }  

        4.2、关闭蓝牙

           直接调用API 函数即disable()即可。

             public  boolean disable ()

               功能:关闭蓝牙设备。

               返回值:该函数会立即返回。

                            true    表示关闭操作成功

                           false   表示蓝牙操作失败 , ①、当前蓝牙已经关闭 ;  ②、其他一些异常情况

 

 

   5、扫描蓝牙设备


      public boolean startDiscovery () 

          功能: 扫描蓝牙设备

          注意: 如果蓝牙没有开启,该方法会返回false ,即不会开始扫描过程。


      public  boolean cancelDiscovery ()

         功能: 取消扫描过程。

         注意: 如果蓝牙没有开启,该方法会返回false。


     public boolean isDiscovering ()

        功能: 是否正在处于扫描过程中。

        注意: 如果蓝牙没有开启,该方法会返回false。

 

   6、 获取蓝牙相关信息

 

    public String getName ()

       功能:获取蓝牙设备Name

    public String getAddress ()

       功能:获取蓝牙设备的硬件地址(MAC地址),例如:00:11:22:AA:BB:CC  

   public boolean setName (String name)

     功能:设置蓝牙设备的Name,


   public Set<BluetoothDevice> getBondedDevices ()

     功能:获取与本机蓝牙所有绑定的远程蓝牙信息,以BluetoothDevice类实例(稍后讲到)返回。

     注意:如果蓝牙为开启,该函数会返回一个空集合 。


  public static boolean checkBluetoothAddress (String address)

     功能: 验证蓝牙设备MAC地址是否有效。所有设备地址的英文字母必须大写,48位,形如:00:43:A8:23:10:F1 。

     返回值: true 设备地址有效

                   false 设备地址无效


 public BluetoothDevice getRemoteDevice (String address)

      功能:以给定的MAC地址去创建一个 BluetoothDevice 类实例(代表远程蓝牙实例)。即使该蓝牙地址不可见,也会产生

          一BluetoothDevice 类实例。

      返回:BluetoothDevice 类实例 。注意,如果该蓝牙设备MAC地址不能被识别,其蓝牙Name为null。

          异常:如果MAC  address无效,抛出IllegalArgumentException

 

 7、蓝牙相关广播


             Action值                                                说明


      ACTION_STATE_CHANGED                    蓝牙状态值发生改变

      ACTION_SCAN_MODE_CHANGED         蓝牙扫描状态(SCAN_MODE)发生改变

      ACTION_DISCOVERY_STARTED             蓝牙扫描过程开始

      ACTION_DISCOVERY_FINISHED             蓝牙扫描过程结束

      ACTION_LOCAL_NAME_CHANGED        蓝牙设备Name发生改变

      ACTION_REQUEST_DISCOVERABLE       请求用户选择是否使该蓝牙能被扫描

                PS:如果蓝牙没有开启,用户点击确定后,会首先开启蓝牙,继而设置蓝牙能被扫描。

      ACTION_REQUEST_ENABLE                  请求用户选择是否打开蓝牙

 

      ACTION_FOUND  (该常量字段位于BluetoothDevice类中,稍后讲到)

                说明:蓝牙扫描时,扫描到任一远程蓝牙设备时,会发送此广播。

 

         通过注册这个广播,我们可以获取扫描到的蓝牙信息。方法如下:

[java]  view plain  copy
 print ?
  1. //扫描到了任一蓝牙设备  
  2. if(BluetoothDevice.ACTION_FOUND.equals(intent.getAction()))  
  3. {  
  4.    Log.v(TAG, "### BT BluetoothDevice.ACTION_FOUND ##");  
  5.                   
  6.    BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
  7.                   
  8.    if(btDevice != null){  
  9.         Log.v(TAG , "Name : " + btDevice.getName() + " Address: " + btDevice.getAddress());  
  10.                       
  11.    }  
  12.    else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction()))  
  13.    {  
  14.         Log.v(TAG, "### BT ACTION_BOND_STATE_CHANGED ##");  
  15.                   
  16.         int cur_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);  
  17.         int previous_bond_state = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.BOND_NONE);  
  18.                   
  19.                   
  20.         Log.v(TAG, "### cur_bond_state ##" + cur_bond_state + " ~~ previous_bond_state" + previous_bond_state);  
  21.     }  
  22. }  

              

 

      最后,关于这些广播的Intent信息,还有很多附加值,大家可以去看看Android SDK。

 

 

 

      更多关于BluetoothAdapter类的API介绍,请参考农民伯伯的博客:

                   《Android 中文API (69) —— BluetoothAdapter[蓝牙]



      最后,在使用这两个类时,需要以下两个权限:             

        BLUETOOTH                    值为  "android.permission.BLUETOOTH"

        BLUETOOTH_ADMIN      值为 "android.permission.BLUETOOTH_ADMIN"



二、 BluetoothDevice类介绍

 

    该类就是关于远程蓝牙设备的一个描述。通过它可以和本地蓝牙设备---BluetoothAdapter连接通信。

 

    1、 蓝牙绑定(Bound)状态 , 即蓝牙设备是否与其他蓝牙绑定

     

       int   BOND_BONDED       表明蓝牙已经绑定

       int   BOND_BONDING     表明蓝牙正在绑定过程中 , bounding

       int   BOND_NONE           表明没有绑定

 

 

    更多关于BluetoothDevice类的更多介绍,请参考该农民伯伯的该篇博客:

                   Android 中文API (70) —— BluetoothDevice[蓝牙]

 

     我也不再啰嗦了。

 


       下面贴出一个小Demo吧,挺简单的,也就是关蓝牙API的基本操作和蓝牙相关广播的监听,处于显示目的方便性,本文对

    蓝牙相关信息的获取,都通过Log输出。请大家注意。 截图如下:

                                              

                                      


        代码什么的就不在张贴了,只是帮助大家学习过程中减少工作量而已,别无其他。


        示例代码下载地址为:


                 http://download.csdn.net/detail/qinjuning/4417003

      

       最后关于如果连接某个蓝牙设备,就需要利用蓝牙部分的隐藏API了,关于这方面,大家可以看看hellogv的博客:

         

                     Android提高第十三篇之探秘蓝牙隐藏API

  

       

      目前还没有机会研究这方面知识,以后会尝试的。 Good luck for U !


已标记关键词 清除标记
相关推荐
``` public class PathFragment extends Fragment { private Button scanBT; public static final int MY_PERMISSION_REQUEST_CONSTANT = 1; public static final int MESSAGE_STATE_CHANGE = 1; public static final int MESSAGE_READ = 2; public static final int MESSAGE_WRITE = 3; public static final int MESSAGE_DEVICE_NAME = 4; public static final int MESSAGE_TOAST = 5; // Key names received from the BluetoothChatService Handler public static final String DEVICE_NAME = "device_name"; public static final String TOAST = "toast"; // Intent请求码 private static final int REQUEST_CONNECT_DEVICE = 1; private static final int REQUEST_ENABLE_BT = 2; private static final int REQUEST_NEW_CARD = 3; private String mConnectedDeviceName = null; private BluetoothAdapter mBluetoothAdapter = null; private BluetoothService mBlueService = null; String recieveStr = "";//暂存当前发过来的字节 int n = 0; MyDatabaseHelper myDatabaseHelper; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View pathLayout = inflater.inflate(R.layout.path_layout, container, false); return pathLayout; } @Override public void onActivityCreated(Bundle savedInstanceState) {//当Activity的onCreate方法执行完后调用。 super.onActivityCreated(savedInstanceState); //打开数据库 myDatabaseHelper = new MyDatabaseHelper(getActivity(),"csport.db",null,1); initViews(); scanBT.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent serverIntent = new Intent(getActivity(), DeviceListActivity.class); startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE); } }); } private void initViews() { scanBT = (Button)getActivity().findViewById(R.id.button_scan); } public void onDestroy() { super.onDestroy(); // Stop the Bluetooth chat services if (mBlueService != null) mBlueService.stop(); } @Override public synchronized void onResume() { super.onResume(); // Performing this check in onResume() covers the case in which BT was // not enabled during onStart(), so we were paused to enable it... // onResume() will be called when ACTION_REQUEST_ENABLE activity returns. if (mBlueService != null) { // Only if the state is STATE_NONE, do we know that we haven't started already if (mBlueService.getState() == BluetoothService.STATE_NONE) { // Start the Bluetooth chat services mBlueService.start(); } } } //处理线程返回信息 private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_STATE_CHANGE://1 Toast.makeText(getActivity(), "change", Toast.LENGTH_LONG); switch (msg.arg1) { case BluetoothService.STATE_CONNECTED: //mTitle.setText(R.string.title_connected_to); //mTitle.append(mConnectedDeviceName); //mConversationArrayAdapter.clear(); break; case BluetoothService.STATE_CONNECTING: //mTitle.setText(R.string.title_connecting); break; case BluetoothService.STATE_LISTEN: case BluetoothService.STATE_NONE: //mTitle.setText(R.string.title_not_connected); break; } break; //发送了信息,显示在本地屏幕上(重写,显示结果即可) case MESSAGE_WRITE://2 Toast.makeText(getActivity(), "发送成功", Toast.LENGTH_LONG); break; //收到了信息,显示在本地屏幕上(重写,加入到通信录) case MESSAGE_READ://3读取数据 byte[] readBuf = (byte[]) msg.obj; recieveStr = new String(readBuf, 0, msg.arg1); if (recieveStr.length() > 7) { break; } else { float res = 0; if (recieveStr != null && recieveStr.length() > 0) { res = Float.parseFloat(recieveStr); //arrayList.add(res); //n ++ ; //Log.e("Tag",String.valueOf(arrayList)); //Log.e("Tag",String.valueOf(n)); } if (n == 30) { //analyzer.deal(MainActivity.this,arrayList); //重置n和arrlist准备接收下一个5min的数据 n = 0; //arrayList.clear(); } } //tView.setText(recieveStr); //writeFile(recieveStr); break; case MESSAGE_DEVICE_NAME://4 // save the connected device's name mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); Toast.makeText(getActivity(), "已成功连接到 " + mConnectedDeviceName, Toast.LENGTH_SHORT).show(); //requestSend();//初次连接成功后请求重发 break; case MESSAGE_TOAST://5 Toast.makeText(getActivity(), msg.getData().getString(TOAST), Toast.LENGTH_SHORT).show(); break; } } }; //处理其他Activity的返回结果 public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CONNECT_DEVICE://1 //当点击了设备列表后返回所指向设备的MAC地址,根据此MAC进行主动连接 if (resultCode == Activity.RESULT_OK) { String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); mBlueService.connect(device); } break; case REQUEST_ENABLE_BT://2 //由确认打开蓝牙Activity返回,若打开成功初始化名片列表 if (resultCode == Activity.RESULT_OK) { // Bluetooth is now enabled, so set up a chat session setupCards(); } else { // User did not enable Bluetooth or an error occured Toast.makeText(getActivity(), R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show(); //finish(); } break; case REQUEST_NEW_CARD://3 //由添加新名片Activity返回,若添加了新card重新读取并显示 if (resultCode == Activity.RESULT_OK) { setupCards(); } break; } } private void setupCards() { //完成显示内容后,初始化蓝牙服务对象 mBlueService = new BluetoothService(mHandler); } //重写setMenuVisibility方法,不然会出现叠层的现象 public void setMenuVisibility(boolean menuVisibility) { super.setMenuVisibility(menuVisibility); if (this.getView() != null) { this.getView().setVisibility(menuVisibility ? View.VISIBLE : View.GONE); } } } ``` 当我把周围的设备搜索出来,准备连接的时候,就给我报错如下:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice(java.lang.String)' on a null object reference 出错的这段代码为:BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 我通过日志打印发现明明address是有值的啊,可是怎么就出这种错误呢,求各位大神指导一下啊! c币不多,能回答上的我追加财富。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页