android:蓝牙不会发现设备

时间:2017-08-19 01:39:39

标签: android bluetooth

我正在编写一个Android-App,它应该通过蓝牙发现设备。

我没有得到任何例外,但是找不到设备,即使我的Windows PC找到它们(并且可以找到它们)。

我确定他们是BLE,但我尝试过两种方式。当然,我是分别尝试过的。

以下是我的 ListActivity ,它会搜索设备:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mHandler = new Handler();

    setContentView(R.layout.bluetooth_list_view);
    listView = getListView();

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
        Toast.makeText(this, "BLE is not supported", Toast.LENGTH_SHORT).show();
        finish();
    }

    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
    Log.d(TAG, "on Create start5");

    if (mBluetoothAdapter == null) {
        Toast.makeText(this, "BLE is not supported", Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    mLeDeviceListAdapter = new LeDeviceListAdapter(this);
    setListAdapter(mLeDeviceListAdapter);
    listView.setAdapter(mLeDeviceListAdapter);

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

    registerReceiver(mReceiver, filter);
    mBluetoothAdapter.startDiscovery(); 
}    

private void scanLeDevice(final boolean enable) {
    Log.e(TAG, "scanLeDevice: " + enable);
    if (enable) {
        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.e(TAG, "after Scan mLeDeviceListAdapter: " + mLeDeviceListAdapter.getCount());
                Log.e(TAG, "after Scan isEmpty(): " + mLeDeviceListAdapter.isEmpty());
                mScanning = false;
                mBluetoothLeScanner.stopScan(mScanCallback);
                invalidateOptionsMenu();
            }
        }, SCAN_PERIOD);

        mScanning = true;
        mBluetoothLeScanner.startScan(mScanCallback);

    } else {
        mScanning = false;
        mBluetoothLeScanner.stopScan(mScanCallback);
    }
    invalidateOptionsMenu();
}

日志显示扫描mLeDeviceListAdapter:0 扫描isEmpty()后:

ScanCallback mScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        Log.e(TAG, "onScanResult: " + result);
        super.onScanResult(callbackType, result);
        mLeDeviceListAdapter.addDevice(result.getDevice());
        mLeDeviceListAdapter.notifyDataSetChanged();
    }
};

永远不会调用该日志( onScanResult )。

而不是BLE:     private final BroadcastReceiver mReceiver = new BroadcastReceiver(){// TODO not ble example         public void onReceive(Context context,Intent intent){             String action = intent.getAction();

        if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            Log.e(TAG, "Not BLE discovry starts");
            //discovery starts, we can show progress dialog or perform other tasks
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            Log.e(TAG, "Not BLE discovry finishes");
            //discovery finishes, dismis progress dialog
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            //bluetooth device found
            BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            Log.e(TAG, "Found device " + device.getName());
        }
    }
};

不打印BLE discovry ,因此不是BLE discovry开始。永远不会打印找到的设备。但我认为这些设备是BLE。

我的清单中有必要的权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

我做错了什么?

修改 我真的需要帮助。我认为到目前为止我尝试/检查过:

  • 启用蓝牙适配器。
  • 授予蓝牙使用权限。
  • 授予位置权限(ACCESS_COARSE和ACCESS_FINE)。
  • 确保已启用gps提供程序(智能手机GPS设置)。

1 个答案:

答案 0 :(得分:0)

可能是因为您没有在onCreate中请求ACCESS_COARSE_LOCATION

该项目是启动蓝牙扫描仪的好资源:

https://github.com/joelwass/Android-BLE-Scan-Example