Android中的回调没有获得BLE(Bluetooth Low Engery)扫描设备?

时间:2016-08-10 12:04:46

标签: android bluetooth-lowenergy android-bluetooth

我们使用谷歌示例代码获取BLE扫描设备。这是链接enter link description here。 下面是scanLeDevice方法和mLeScanCallback回调方法

            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.util.Log;
            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;

            /**
             * Activity for scanning and displaying available Bluetooth LE devices.
             */
            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;
                private static final int REQUEST_DISCOVERABLE = 2;


                // Stops scanning after 10 seconds.
                private static final long SCAN_PERIOD = 1000000;

                @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;
                    }
                    if (!mBluetoothAdapter.isEnabled()) {
                        if (!mBluetoothAdapter.isEnabled()) {
                            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

                        }
                    }
                    makeDiscoverable();
                }

                @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;
                }
                private void makeDiscoverable() {
                    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 30000);
                    startActivity(discoverableIntent);
                    Log.i("Log", "Discoverable ");
                }
                @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);
            //                makeDiscoverable();
            //            }
            //        }

                    // 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();
                }

                @Override
                protected void onListItemClick(ListView l, View v, int position, long id) {
                    final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
                    if (device == null) return;
                    final Intent intent = new Intent(this, DeviceControlActivity.class);
                    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName());
                    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
                    if (mScanning) {
                        mBluetoothAdapter.stopLeScan(mLeScanCallback);
                        mScanning = false;
                    }
                    startActivity(intent);
                }

                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<BluetoothDevice> mLeDevices;
                    private LayoutInflater mInflator;

                    public LeDeviceListAdapter() {
                        super();
                        mLeDevices = new ArrayList<BluetoothDevice>();
                        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;
                }
            }   

任何人都可以知道什么是问题,或者代码中是否需要任何其他设置才能正常工作?

0 个答案:

没有答案