首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android BLE设备发现、连接和断开

Android BLE设备发现、连接和断开
EN

Stack Overflow用户
提问于 2018-08-23 10:30:30
回答 2查看 152关注 0票数 0

基本上,我是一名iOS开发人员。我需要扫描、连接和断开BLE设备。在iOS中一切工作正常。然后,我尝试使用以下代码在Android中进行扫描。任何时候都不会扫描任何设备。如果我做错了什么,有人能帮我吗?

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
BluetoothAdapter bluetoothAdapter;
TextView statusTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    statusTextView = (TextView)findViewById(R.id.statusTxtView);
}

@Override
protected void onStart() {
    super.onStart();

    enableBluetooth();
}

private void enableBluetooth() {
    final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    bluetoothAdapter = bluetoothManager.getAdapter();

    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        statusTextView.setText("BT disabled");
        Intent enableBtIntent =
                new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, 1);
    } else {
        statusTextView.setText("BT enabled");
    }

    boolean status = bluetoothAdapter.startDiscovery();

    if (status == true) {
        statusTextView.setText("Start scanning");
    } else {
        statusTextView.setText("Failed scanning");
    }
}

BluetoothAdapter.LeScanCallback scanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
        statusTextView.setText(device.getName());
    }
};

}

EN

回答 2

Stack Overflow用户

发布于 2018-08-23 12:33:59

您尚未开始扫描。使用bluetoothAdapter.startDiscovery()启动蓝牙发现后,您必须开始扫描才能获得扫描结果。使用以下代码启动扫描。

我还没有测试过它,但它应该是这样工作的:

代码语言:javascript
复制
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
scanner.startScan(scanCallback);

其中scanCallback是您已创建但未使用的上述回调。

确保您拥有BLUETOOTH_ADMIN权限。

票数 0
EN

Stack Overflow用户

发布于 2018-08-23 12:40:25

首先,你必须扫描设备

代码语言:javascript
复制
@SuppressLint("NewApi")
private void turnonBLE() {
    // TODO Auto-generated method stub
    manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
    mBLEAdapter = manager.getAdapter();
    mLeScanner = mBLEAdapter.getBluetoothLeScanner();

    mBLEAdapter.enable();
    scanLeDevice(true);
    Toast.makeText(getApplicationContext(), "BTLE ON Service",
            Toast.LENGTH_LONG).show();
    Log.e("BLE_Scanner", "TurnOnBLE");
}

如果未使用任何uuid,则不使用uuid进行扫描

代码语言:javascript
复制
public void scanLeDevice(final boolean enable) {
    if (enable) {

        if (Build.VERSION.SDK_INT < 21) {
            mBLEAdapter.startLeScan(mLeScanCallback);
        } else {
            ParcelUuid uuid = ParcelUuid.fromString(UUIDList.SENSOR_MAIN_SERVICE_UUID_STRING.toString());
            ScanFilter scanFilter = new ScanFilter.Builder().setServiceUuid(uuid).build();
            ScanSettings settings = new ScanSettings.Builder()
                    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                    .setReportDelay(0)
                    .build();

            if (mLeScanner != null)
                mLeScanner.startScan(Collections.singletonList(scanFilter), settings, mScanCallback);
        }
    } else {
        if (Build.VERSION.SDK_INT < 21) {
            mBLEAdapter.stopLeScan(mLeScanCallback);
        } else {
            mLeScanner.stopScan(mScanCallback);
        }
    }
}

从那个调用scanCallback

代码语言:javascript
复制
private ScanCallback mScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        BluetoothDevice btDevice = result.getDevice();
        connectToDevice(btDevice, result.getScanRecord().getBytes());
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        for (ScanResult sr : results) {
            Log.e("ScanResult - Results", sr.toString());
        }
    }

    @Override
    public void onScanFailed(int errorCode) {
        Log.e("Scan Failed", "Error Code: " + errorCode);

    }
};

对于连接设备,请调用gattCallback

代码语言:javascript
复制
private synchronized void connectToDevice(BluetoothDevice device, byte[] scanRecord) {
    mGatt = device.connectGatt(getApplicationContext(), false, mBtGattCallback);
 }

private BluetoothGattCallback mBtGattCallback = new BluetoothGattCallback() {
    // override all methods
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51977578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档