如何在android中刷新ble广告商和ble扫描仪?

如何在android中刷新ble广告商和ble扫描仪?,android,refresh,bluetooth-lowenergy,Android,Refresh,Bluetooth Lowenergy,我的应用程序正在安卓系统中使用ble进行广告和扫描。它每天大概需要1小时(可能更少),但现在,为了测试,我正在努力让它更有效。 过了一段时间,我意识到如果没有bug,它不可能永远运行。 我得到了错误号2和4(一个用于广告,一个用于扫描)。 在我看到日志中的错误之前,始终有一行代码,如: 01-26 19:59:09.509 D/BluetoothLeScanner:OnClient注册()-status=133 clientIf=21 clientIf附近的数字一直在变大,直到出现错误,所以我猜

我的应用程序正在安卓系统中使用ble进行广告和扫描。它每天大概需要1小时(可能更少),但现在,为了测试,我正在努力让它更有效。 过了一段时间,我意识到如果没有bug,它不可能永远运行。 我得到了错误号2和4(一个用于广告,一个用于扫描)。 在我看到日志中的错误之前,始终有一行代码,如:

01-26 19:59:09.509 D/BluetoothLeScanner:OnClient注册()-status=133 clientIf=21

clientIf附近的数字一直在变大,直到出现错误,所以我猜测扫描仪/广告商正在收集有关扫描/广告设备的数据。我看到了一些解决方案的选择,比如在操作之间等待一段时间,或者制作
mbluetothgatt.close()
等待没有帮助,而且我的应用程序没有使用gatt(我没有在应用程序中进行任何配对),因此我想我可能会再次初始化BluetoothLeScanner/BluetoothLeAdvertiser,但这并没有阻止clientIf附近的数字升高,当然错误再次发生。
有人知道如何将clientIf附近的数字“归零”吗?当然,还有其他方法可以防止错误发生吗?谢谢
我读到的最相关的问题是:

编辑:在这里我将添加ble的代码。 这是扫描代码:

public class StDataCentralBle {
    private static final String TAG = ScannerFragment.class.getSimpleName();
    private static final long SCAN_PERIOD = 15000;
    private BluetoothAdapter mBluetoothAdapter;
    public BluetoothLeScanner mBluetoothLeScanner;
    private ScanCallback mScanCallback;
    private Vector<String> ScanResultArray;//intended to replace the adapter
    private Context context;

private Handler mHandler;
//todo open this:
public StDataCentralBle(Context context){
    this.context=context;


public void setBluetoothAdapter(BluetoothAdapter btAdapter) {
    this.mBluetoothAdapter = btAdapter;
    mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
}
public void startScanning() {
    if (mScanCallback == null && mBluetoothAdapter!=null && mBluetoothAdapter.isEnabled()) {
        Log.d(TAG, "Starting Scanning");

        // Will stop the scanning after a set time.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.v("ble_process","BT state is: "+mBluetoothAdapter.getScanMode());
                stopScanning();
            }
        }, SCAN_PERIOD);

        // Kick off a new scan.
        mScanCallback = new SampleScanCallback();
        mBluetoothLeScanner.startScan(buildScanFilters(), buildScanSettings(), mScanCallback);

        Toast.makeText(context, "started scan", Toast.LENGTH_SHORT).show();
    } else {
        Log.v("ble_process","didnt start scan");

    }
}

/**
 * Stop scanning for BLE Advertisements.
 */
public void stopScanning() {
    // Stop the scan, wipe the callback.
    if(mBluetoothLeScanner!=null && mBluetoothAdapter.isEnabled() && mBluetoothAdapter.getState()==21) {
        mBluetoothLeScanner.stopScan(mScanCallback);
        Log.v("ble_process", "stopping scanning");
    }
    mScanCallback = null;
    if(mBluetoothAdapter!=null)
        mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
    Toast.makeText(context, "stoped scan", Toast.LENGTH_SHORT).show();
}
/**
 * Return a List of {@link ScanFilter} objects to filter by Service UUID.
 */
private List<ScanFilter> buildScanFilters() {
    List<ScanFilter> scanFilters = new ArrayList<>();

    ScanFilter.Builder builder = new ScanFilter.Builder();
    // Comment out the below line to see all BLE devices around you
    builder.setServiceUuid(Constants.Service_UUID);
    scanFilters.add(builder.build());

    return scanFilters;
}

/**
 * Return a {@link ScanSettings} object set to use low power (to preserve battery life).
 */
private ScanSettings buildScanSettings() {
    ScanSettings.Builder builder = new ScanSettings.Builder();
    builder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER);
    return builder.build();
}

/**
 * Custom ScanCallback object - adds to adapter on success, displays error on failure.
 */
private class SampleScanCallback extends ScanCallback {
    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        super.onBatchScanResults(results);

        for (ScanResult result : results) {

        }

    }

    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);
        Log.v("onscanResult","onscanRes");
        Toast.makeText(context.getApplicationContext(), "scan resulted ! ", Toast.LENGTH_SHORT).show();
        //get the data from advertise:
        byte[] Service_Data_bytes=result.getScanRecord().getServiceData(Constants.Service_UUID);
        if(Service_Data_bytes!=null) {
            String Service_Data = new String(Service_Data_bytes);
            Log.v("scanRes:", Service_Data);

            createNewcross(result);
        }
    }
    public void createNewcross(ScanResult scanResult){
        Log.v("createNewcross ", "new cross " );
        byte[] Service_Data_bytes=scanResult.getScanRecord().getServiceData(Constants.Service_UUID);//gilad
        String Service_Data = new String(Service_Data_bytes);


        String other_user=Service_Data ;

    }

    @Override
    public void onScanFailed(int errorCode) {
        super.onScanFailed(errorCode);
        Log.v("ble_process","scan_failed_error_code: "+errorCode);
        Toast.makeText(context.getApplicationContext(), "scan failed! ", Toast.LENGTH_SHORT).show();

        }


    }

}
}
操作它的计时器:

private class StartCentralTask extends TimerTask {
    Context ServiceContext;

    private StartCentralTask(Context context) {
        ServiceContext = context;
    }

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {
            @Override
            public void run() {

                start_central_ble(ServiceContext);

            }
        });
    }
}

你有什么android设备和操作系统版本?你必须确保做的唯一一件事就是关闭BluetoothGatt对象,停止已启动的扫描,并在完成后停止广告,因为每个对象占用一个插槽。moto g 1st gen.android 5.1(或者可能是5.2)。我关闭了扫描,做了很多广告。我怎样才能关闭蓝牙关贸总协定?我甚至不用它。我有一个MotoG(第三代),运行安卓5.1.1。我试图启动一个BLE扫描仪,当我收到av广告包时,我停止了扫描,并启动了一个新的BLE扫描仪。这并没有增加用于下一个对象的clientIf。对于BLE广告商来说,开始和停止都很好,而且每次都不会增加客户数量。你可以发布你使用的代码吗?我为你的请求添加了一些代码。希望这会有所帮助。我在代码中看到的唯一可能的问题是,如果在上一次扫描停止之前启动新扫描。然后,您将在超时时取消错误的扫描。这可能是原因吗?你也有一些广告代码吗?广告商和扫描器是从同一个GATT客户端池中分配的。你们有什么android设备和操作系统版本?你必须确保做的唯一一件事就是关闭BluetoothGatt对象,停止已启动的扫描,并在完成后停止广告,因为每个对象占用一个插槽。moto g 1st gen.android 5.1(或者可能是5.2)。我关闭了扫描,做了很多广告。我怎样才能关闭蓝牙关贸总协定?我甚至不用它。我有一个MotoG(第三代),运行安卓5.1.1。我试图启动一个BLE扫描仪,当我收到av广告包时,我停止了扫描,并启动了一个新的BLE扫描仪。这并没有增加用于下一个对象的clientIf。对于BLE广告商来说,开始和停止都很好,而且每次都不会增加客户数量。你可以发布你使用的代码吗?我为你的请求添加了一些代码。希望这会有所帮助。我在代码中看到的唯一可能的问题是,如果在上一次扫描停止之前启动新扫描。然后,您将在超时时取消错误的扫描。这可能是原因吗?你也有一些广告代码吗?广告商和扫描器是从同一批GATT客户中分配的。
private class StartCentralTask extends TimerTask {
    Context ServiceContext;

    private StartCentralTask(Context context) {
        ServiceContext = context;
    }

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {
            @Override
            public void run() {

                start_central_ble(ServiceContext);

            }
        });
    }
}