安卓专题

安卓蓝牙控制案例源码

  如果我们想通过我们的应用程序交换不同设备之间的数据,蓝牙是一种适用于支持蓝牙设备之间进行的无线连接。 Android系统为我们提供了蓝牙的API,从中我们可以:查找配对的蓝牙设备,搜索其他蓝牙设备并连接到其中的一个或多个设备,我们将要创建一个激活和取消激活蓝牙的应用程序,找到已配对的蓝牙设备,并扫描发现的蓝牙设备。

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity" >

  <TextView
       android:id="@+id/text"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textAppearance="?android:attr/textAppearanceLarge"
       android:text="@string/Text" />
    
   <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="horizontal"
      android:layout_marginTop="30dp" >

   <Button
      android:id="@+id/turnOn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/on" />

   <Button
      android:id="@+id/turnOff"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/off" />

   </LinearLayout>
  
  
   <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:orientation="vertical"
      android:layout_marginTop="80dp" >
  
          <Button
             android:id="@+id/paired"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/List" />
           
          <Button
             android:id="@+id/search"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/Find" />

          <ListView
              android:id="@+id/listView1"
              android:layout_width="fill_parent"
              android:layout_height="200dp" >
      
          </ListView>

   </LinearLayout>

</RelativeLayout>

建立一个res/values/strings.xml用于我们菜单显示:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">BluetoothTest</string>
    <string name="action_settings">Settings</string>
    <string name="Text">Status: -</string>
    <string name="on">Turn On</string>
    <string name="off">Turn Off</string>
    <string name="List">List paired Devices</string>
    <string name="Find">Search new Devices / Cancel</string>

</resources>

与蓝牙互动是通过BluetoothAdapter类,调用getDefaultAdapter()获得一个实例。要打开蓝牙,首先我们应该检查是否BluetoothAdapter已经启用。如果不是,使用ACTION_REQUEST_ENABLE意图调用startActivityForResult()方法。注意到startActivityForResult()方法的第二个参数,是整数,被设定为大于0。

蓝牙一个非常重要的功能是扫描和搜索,在局部区域发现可访问的设备。当我们说可发现,我们的意思是一个设备可被启用,它的信息是共享的可见的。要设置配对设备使用getBondedDevices(),这样我们就可以找出所有的BluetoothDevices。

考虑到startDiscovery()方法用于设备发现的性能问题,要获得所发现的BluetoothDevices所有信息,我们应该用ACTION_FOUND意图注册一个BroadcastReceiver。我们建议取消的发现过程,因为BluetoothAdapter消耗很多资源,所以cancelDiscovery()用于这个目的。

public class MainActivity extends Activity {

   private static final int REQUEST_ENABLE_BT = 1;
   private Button onBtn;
   private Button offBtn;
   private Button listBtn;
   private Button findBtn;
   private TextView text;
   private BluetoothAdapter myBluetoothAdapter;
   private Set<BluetoothDevice> pairedDevices;
   private ListView myListView;
   private ArrayAdapter<String> BTArrayAdapter;
 
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
     
      // take an instance of BluetoothAdapter - Bluetooth radio
      myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
      if(myBluetoothAdapter == null) {
             onBtn.setEnabled(false);
             offBtn.setEnabled(false);
             listBtn.setEnabled(false);
             findBtn.setEnabled(false);
             text.setText("Status: not supported");
             
             Toast.makeText(getApplicationContext(),"Your device does not support Bluetooth",
                      Toast.LENGTH_LONG).show();
      } else {
             text = (TextView) findViewById(R.id.text);
             onBtn = (Button)findViewById(R.id.turnOn);
             onBtn.setOnClickListener(new OnClickListener() {
                    
                     @Override
                     public void onClick(View v) {
                            // TODO Auto-generated method stub
                            on(v);
                     }
             });
            
             offBtn = (Button)findViewById(R.id.turnOff);
             offBtn.setOnClickListener(new OnClickListener() {
                  
                   @Override
                   public void onClick(View v) {
                          // TODO Auto-generated method stub
                          off(v);
                   }
             });
            
             listBtn = (Button)findViewById(R.id.paired);
             listBtn.setOnClickListener(new OnClickListener() {
                  
                   @Override
                   public void onClick(View v) {
                          // TODO Auto-generated method stub
                          list(v);
                   }
             });
            
             findBtn = (Button)findViewById(R.id.search);
             findBtn.setOnClickListener(new OnClickListener() {
                  
                   @Override
                   public void onClick(View v) {
                          // TODO Auto-generated method stub
                          find(v);
                   }
             });
          
             myListView = (ListView)findViewById(R.id.listView1);
      
             // create the arrayAdapter that contains the BTDevices, and set it to the ListView
             BTArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
             myListView.setAdapter(BTArrayAdapter);
      }
   }

   public void on(View view){
      if (!myBluetoothAdapter.isEnabled()) {
         Intent turnOnIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
         startActivityForResult(turnOnIntent, REQUEST_ENABLE_BT);

         Toast.makeText(getApplicationContext(),"Bluetooth turned on" ,
                       Toast.LENGTH_LONG).show();
      }
      else{
         Toast.makeText(getApplicationContext(),"Bluetooth is already on",
                       Toast.LENGTH_LONG).show();
      }
   }
  
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          // TODO Auto-generated method stub
          if(requestCode == REQUEST_ENABLE_BT){
                 if(myBluetoothAdapter.isEnabled()) {
                        text.setText("Status: Enabled");
                 } else {  
                        text.setText("Status: Disabled");
                 }
          }
   }
  
   public void list(View view){
         // get paired devices
      pairedDevices = myBluetoothAdapter.getBondedDevices();
     
      // put it's one to the adapter
      for(BluetoothDevice device : pairedDevices)
             BTArrayAdapter.add(device.getName()+ "\n" + device.getAddress());

      Toast.makeText(getApplicationContext(),"Show Paired Devices",
                    Toast.LENGTH_SHORT).show();
     
   }
  
   final BroadcastReceiver bReceiver = new BroadcastReceiver() {
           public void onReceive(Context context, Intent intent) {
               String action = intent.getAction();
               // When discovery finds a device
               if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    // Get the BluetoothDevice object from the Intent
                       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                       // add the name and the MAC address of the object to the arrayAdapter
                    BTArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                    BTArrayAdapter.notifyDataSetChanged();
               }
           }
       };
      
   public void find(View view) {
          if (myBluetoothAdapter.isDiscovering()) {
                 // the button is pressed when it discovers, so cancel the discovery
                 myBluetoothAdapter.cancelDiscovery();
          }
          else {
                     BTArrayAdapter.clear();
                     myBluetoothAdapter.startDiscovery();
                    
                     registerReceiver(bReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
              }   
   }
  
   public void off(View view){
         myBluetoothAdapter.disable();
         text.setText("Status: Disconnected");
        
      Toast.makeText(getApplicationContext(),"Bluetooth turned off",
                    Toast.LENGTH_LONG).show();
   }
  
   @Override
   protected void onDestroy() {
          // TODO Auto-generated method stub
          super.onDestroy();
          unregisterReceiver(bReceiver);
   }
             
}

设置权限AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xx.android.bluetoothtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
   
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xx.android.bluetoothtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

运行效果界面:

 

本案例源码下载