DeviceListActivity.java
上传用户:hollekit
上传日期:2021-04-23
资源大小:91k
文件大小:8k
源码类别:

android开发

开发平台:

Java

  1. /*
  2.  * Copyright (C) 2009 The Android Open Source Project
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *
  8.  *      http://www.apache.org/licenses/LICENSE-2.0
  9.  *
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. package com.example.android.BluetoothChat;
  17. import java.util.Set;
  18. import android.app.Activity;
  19. import android.bluetooth.BluetoothAdapter;
  20. import android.bluetooth.BluetoothDevice;
  21. import android.content.BroadcastReceiver;
  22. import android.content.Context;
  23. import android.content.Intent;
  24. import android.content.IntentFilter;
  25. import android.os.Bundle;
  26. import android.util.Log;
  27. import android.view.View;
  28. import android.view.Window;
  29. import android.view.View.OnClickListener;
  30. import android.widget.AdapterView;
  31. import android.widget.ArrayAdapter;
  32. import android.widget.Button;
  33. import android.widget.ListView;
  34. import android.widget.TextView;
  35. import android.widget.AdapterView.OnItemClickListener;
  36. /**
  37.  * This Activity appears as a dialog. It lists any paired devices and
  38.  * devices detected in the area after discovery. When a device is chosen
  39.  * by the user, the MAC address of the device is sent back to the parent
  40.  * Activity in the result Intent.
  41.  */
  42. public class DeviceListActivity extends Activity {
  43.     // Debugging
  44.     private static final String TAG = "DeviceListActivity";
  45.     private static final boolean D = true;
  46.     // Return Intent extra
  47.     public static String EXTRA_DEVICE_ADDRESS = "device_address";
  48.     // Member fields
  49.     private BluetoothAdapter mBtAdapter;
  50.     private ArrayAdapter<String> mPairedDevicesArrayAdapter;
  51.     private ArrayAdapter<String> mNewDevicesArrayAdapter;
  52.     @Override
  53.     protected void onCreate(Bundle savedInstanceState) {
  54.         super.onCreate(savedInstanceState);
  55.         // Setup the window
  56.         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
  57.         setContentView(R.layout.device_list);
  58.         // Set result CANCELED incase the user backs out
  59.         setResult(Activity.RESULT_CANCELED);
  60.         // Initialize the button to perform device discovery
  61.         Button scanButton = (Button) findViewById(R.id.button_scan);
  62.         scanButton.setOnClickListener(new OnClickListener() {
  63.             public void onClick(View v) {
  64.                 doDiscovery();
  65.                 v.setVisibility(View.GONE);
  66.             }
  67.         });
  68.         // Initialize array adapters. One for already paired devices and
  69.         // one for newly discovered devices
  70.         mPairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
  71.         mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name);
  72.         // Find and set up the ListView for paired devices
  73.         ListView pairedListView = (ListView) findViewById(R.id.paired_devices);
  74.         pairedListView.setAdapter(mPairedDevicesArrayAdapter);
  75.         pairedListView.setOnItemClickListener(mDeviceClickListener);
  76.         // Find and set up the ListView for newly discovered devices
  77.         ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);
  78.         newDevicesListView.setAdapter(mNewDevicesArrayAdapter);
  79.         newDevicesListView.setOnItemClickListener(mDeviceClickListener);
  80.         // Register for broadcasts when a device is discovered
  81.         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
  82.         this.registerReceiver(mReceiver, filter);
  83.         // Register for broadcasts when discovery has finished
  84.         filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
  85.         this.registerReceiver(mReceiver, filter);
  86.         // Get the local Bluetooth adapter
  87.         mBtAdapter = BluetoothAdapter.getDefaultAdapter();
  88.         // Get a set of currently paired devices
  89.         Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
  90.         // If there are paired devices, add each one to the ArrayAdapter
  91.         if (pairedDevices.size() > 0) {
  92.             findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
  93.             for (BluetoothDevice device : pairedDevices) {
  94.                 mPairedDevicesArrayAdapter.add(device.getName() + "n" + device.getAddress());
  95.             }
  96.         } else {
  97.             String noDevices = getResources().getText(R.string.none_paired).toString();
  98.             mPairedDevicesArrayAdapter.add(noDevices);
  99.         }
  100.     }
  101.     @Override
  102.     protected void onDestroy() {
  103.         super.onDestroy();
  104.         // Make sure we're not doing discovery anymore
  105.         if (mBtAdapter != null) {
  106.             mBtAdapter.cancelDiscovery();
  107.         }
  108.         // Unregister broadcast listeners
  109.         this.unregisterReceiver(mReceiver);
  110.     }
  111.     /**
  112.      * Start device discover with the BluetoothAdapter
  113.      */
  114.     private void doDiscovery() {
  115.         if (D) Log.d(TAG, "doDiscovery()");
  116.         // Indicate scanning in the title
  117.         setProgressBarIndeterminateVisibility(true);
  118.         setTitle(R.string.scanning);
  119.         // Turn on sub-title for new devices
  120.         findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);
  121.         // If we're already discovering, stop it
  122.         if (mBtAdapter.isDiscovering()) {
  123.             mBtAdapter.cancelDiscovery();
  124.         }
  125.         // Request discover from BluetoothAdapter
  126.         mBtAdapter.startDiscovery();
  127.     }
  128.     // The on-click listener for all devices in the ListViews
  129.     private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {
  130.         public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
  131.             // Cancel discovery because it's costly and we're about to connect
  132.             mBtAdapter.cancelDiscovery();
  133.             // Get the device MAC address, which is the last 17 chars in the View
  134.             String info = ((TextView) v).getText().toString();
  135.             String address = info.substring(info.length() - 17);
  136.             // Create the result Intent and include the MAC address
  137.             Intent intent = new Intent();
  138.             intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
  139.             // Set result and finish this Activity
  140.             setResult(Activity.RESULT_OK, intent);
  141.             finish();
  142.         }
  143.     };
  144.     // The BroadcastReceiver that listens for discovered devices and
  145.     // changes the title when discovery is finished
  146.     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
  147.         @Override
  148.         public void onReceive(Context context, Intent intent) {
  149.             String action = intent.getAction();
  150.             // When discovery finds a device
  151.             if (BluetoothDevice.ACTION_FOUND.equals(action)) {
  152.                 // Get the BluetoothDevice object from the Intent
  153.                 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
  154.                 // If it's already paired, skip it, because it's been listed already
  155.                 if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
  156.                     mNewDevicesArrayAdapter.add(device.getName() + "n" + device.getAddress());
  157.                 }
  158.             // When discovery is finished, change the Activity title
  159.             } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
  160.                 setProgressBarIndeterminateVisibility(false);
  161.                 setTitle(R.string.select_device);
  162.                 if (mNewDevicesArrayAdapter.getCount() == 0) {
  163.                     String noDevices = getResources().getText(R.string.none_found).toString();
  164.                     mNewDevicesArrayAdapter.add(noDevices);
  165.                 }
  166.             }
  167.         }
  168.     };
  169. }