Android listing BLE devices after device scan

匿名 (未验证) 提交于 2019-12-03 01:56:01

问题:

Can u provide me the simple code for scanning the nearby BLE devices and list it by device name and MAC ID. I tried this using sample code provided in http://developer.android.com/guide/topics/connectivity/bluetooth-le.html. But didn't work, any reference link or ideas since i am new to BLE app.

回答1:

This example is based on the developers web you posted and works great for me. This is the code:

DeviceScanActivity.class

package com.example.android.bluetoothlegatt;  import android.app.Activity; import android.app.ListActivity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList;  public class DeviceScanActivity extends ListActivity { private LeDeviceListAdapter mLeDeviceListAdapter; private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler;  private static final int REQUEST_ENABLE_BT = 1; // Stops scanning after 10 seconds. private static final long SCAN_PERIOD = 10000;  @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     getActionBar().setTitle(R.string.title_devices);     mHandler = new Handler();      // Use this check to determine whether BLE is supported on the device.  Then you can     // selectively disable BLE-related features.     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {         Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();         finish();     }     // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to     // BluetoothAdapter through BluetoothManager.     final BluetoothManager bluetoothManager =             (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);     mBluetoothAdapter = bluetoothManager.getAdapter();     // Checks if Bluetooth is supported on the device.     if (mBluetoothAdapter == null) {         Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();         finish();         return;     } }  @Override public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.main, menu);     if (!mScanning) {         menu.findItem(R.id.menu_stop).setVisible(false);         menu.findItem(R.id.menu_scan).setVisible(true);         menu.findItem(R.id.menu_refresh).setActionView(null);     } else {         menu.findItem(R.id.menu_stop).setVisible(true);         menu.findItem(R.id.menu_scan).setVisible(false);         menu.findItem(R.id.menu_refresh).setActionView(                 R.layout.actionbar_indeterminate_progress);     }     return true; }  @Override public boolean onOptionsItemSelected(MenuItem item) {     switch (item.getItemId()) {         case R.id.menu_scan:             mLeDeviceListAdapter.clear();             scanLeDevice(true);             break;         case R.id.menu_stop:             scanLeDevice(false);             break;     }     return true; }  @Override protected void onResume() {     super.onResume();     // Ensures Bluetooth is enabled on the device.  If Bluetooth is not currently enabled,     // fire an intent to display a dialog asking the user to grant permission to enable it.     if (!mBluetoothAdapter.isEnabled()) {         if (!mBluetoothAdapter.isEnabled()) {             Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);             startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);         }     }     // Initializes list view adapter.     mLeDeviceListAdapter = new LeDeviceListAdapter();     setListAdapter(mLeDeviceListAdapter);     scanLeDevice(true); }  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {     // User chose not to enable Bluetooth.     if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {         finish();         return;     }     super.onActivityResult(requestCode, resultCode, data); }  @Override protected void onPause() {     super.onPause();     scanLeDevice(false);     mLeDeviceListAdapter.clear(); }  private void scanLeDevice(final boolean enable) {     if (enable) {         // Stops scanning after a pre-defined scan period.         mHandler.postDelayed(new Runnable() {             @Override             public void run() {                 mScanning = false;                 mBluetoothAdapter.stopLeScan(mLeScanCallback);                 invalidateOptionsMenu();             }         }, SCAN_PERIOD);         mScanning = true;         mBluetoothAdapter.startLeScan(mLeScanCallback);     } else {         mScanning = false;         mBluetoothAdapter.stopLeScan(mLeScanCallback);     }     invalidateOptionsMenu(); }  // Adapter for holding devices found through scanning. private class LeDeviceListAdapter extends BaseAdapter {     private ArrayList mLeDevices;     private LayoutInflater mInflator;      public LeDeviceListAdapter() {         super();         mLeDevices = new ArrayList();         mInflator = DeviceScanActivity.this.getLayoutInflater();     }      public void addDevice(BluetoothDevice device) {         if(!mLeDevices.contains(device)) {             mLeDevices.add(device);         }     }      public BluetoothDevice getDevice(int position) {         return mLeDevices.get(position);     }      public void clear() {         mLeDevices.clear();     }      @Override     public int getCount() {         return mLeDevices.size();     }      @Override     public Object getItem(int i) {         return mLeDevices.get(i);     }      @Override     public long getItemId(int i) {         return i;     }      @Override     public View getView(int i, View view, ViewGroup viewGroup) {         ViewHolder viewHolder;         // General ListView optimization code.         if (view == null) {             view = mInflator.inflate(R.layout.listitem_device, null);             viewHolder = new ViewHolder();             viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);             viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);             view.setTag(viewHolder);         } else {             viewHolder = (ViewHolder) view.getTag();         }          BluetoothDevice device = mLeDevices.get(i);         final String deviceName = device.getName();         if (deviceName != null && deviceName.length() > 0)             viewHolder.deviceName.setText(deviceName);         else             viewHolder.deviceName.setText(R.string.unknown_device);         viewHolder.deviceAddress.setText(device.getAddress());          return view;     } }  // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback =         new BluetoothAdapter.LeScanCallback() {      @Override     public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {         runOnUiThread(new Runnable() {             @Override             public void run() {                 mLeDeviceListAdapter.addDevice(device);                 mLeDeviceListAdapter.notifyDataSetChanged();             }         });     } };  static class ViewHolder {     TextView deviceName;     TextView deviceAddress; }

}

The custom layout for the Listview listitem_device.xml :

The progress bar on scanning actionbar_indeterminate_progress.xml :

The menu layout main.xml :

The strings layout strings.xml :

BLE is not supportedBluetooth not supported.Unknown deviceConnectDisconnectScanStop

And the manifest AndroidManifest.xml :

I think this is all. If I missed anything let me now and I fix it. Hope it helps!!

(Bluetooth LE quite sucks in Android yet :D... needs and update fast!)

UPDATE:

Download here a full example of BLE scan and connection: https://dl.dropboxusercontent.com/u/18548987/DeviceScanActivity.rar



回答2:

this is quite old question, but for future readers I just want to propose to check out official source codes provided by Bluetooth SIG:

Application Accelerator

There are small, easy to understand and documented apps for most mobile platforms (Android, iOS, Windows Phone and more) + some materials/tutorials. If you want to start playing with BLE this is the best starting point in my opinion.

Everything is free, but you need to register on the website. As far as I remember there is maybe 1-3 emails by year, all connected with new tools for Bluetooth development.

Darek



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!