Kontakt.io iBeacon 在 Android 上的扫描间隔太长

Kontakt.io iBeacon gets scanned with too much interval on Android

我买了 3 个 kontakt.io iBeacon,创建代码以便在 IOS 上扫描它们没有问题,但是对于 android 我遇到了一些问题.. 错误是我可以正确扫描一次 iBeacon,但之后它们不再被扫描,或者在很长一段时间后才被扫描,这是我到目前为止使用的代码:

public class BeaconMonitorActivity extends Activity {

    private static final int REQUEST_CODE_ENABLE_BLUETOOTH = 1;

    private BeaconManager beaconManager;

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

        beaconManager = BeaconManager.newInstance(this);
        beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
        beaconManager.setScanMode(1);
        beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
        beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
            @Override
            public void onMonitorStart() {

            }

            @Override
            public void onMonitorStop() {}

            @Override
            public void onBeaconsUpdated(final Region region, final List<BeaconDevice> beacons) {}

            @Override
            public void onBeaconAppeared(final Region region, final BeaconDevice beacon) {

                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(
                    new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            if(beacon.getProximity() == Proximity.IMMEDIATE)
                            {
                                if(beacon.getMinor() == 33506)
                                {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
                                    builder.setMessage("Trovato iBeacon 1")
                                       .setCancelable(false)
                                       .setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                                BeaconMonitorActivity.this.finish();
                                           }
                                       })
                                       .setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                               try {
                                                beaconManager.startMonitoring();
                                            } catch (RemoteException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                               try {
                                                    beaconManager.startMonitoring();
                                                } catch (RemoteException e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }
                                                dialog.cancel();
                                           }
                                       });
                                    AlertDialog alert = builder.create();
                                    alert.show();
                                }

                                if(beacon.getMinor() == 16706)
                                {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
                                    builder.setMessage("Trovato iBeacon 2")
                                       .setCancelable(false)
                                       .setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                                BeaconMonitorActivity.this.finish();
                                           }
                                       })
                                       .setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                               try {
                                                beaconManager.startMonitoring();
                                            } catch (RemoteException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                               try {
                                                    beaconManager.startMonitoring();
                                                } catch (RemoteException e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }
                                                dialog.cancel();
                                           }
                                       });
                                    AlertDialog alert = builder.create();
                                    alert.show();
                                }

                                if(beacon.getMinor() == 48997)
                                {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
                                    builder.setMessage("Trovato iBeacon 3")
                                       .setCancelable(false)
                                       .setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                                BeaconMonitorActivity.this.finish();
                                           }
                                       })
                                       .setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
                                           public void onClick(DialogInterface dialog, int id) {
                                               try {
                                                beaconManager.startMonitoring();
                                            } catch (RemoteException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                               try {
                                                beaconManager.startMonitoring();
                                            } catch (RemoteException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                            }
                                                dialog.cancel();
                                           }
                                       });
                                    AlertDialog alert = builder.create();
                                    alert.show();
                                }
                            }
                        }
                    }
                );

            }

            @Override
            public void onRegionEntered(final Region region) {}

            @Override
            public void onRegionAbandoned(final Region region) {}


        });

    }

    @Override
    protected void onStart() {
        super.onStart();
        if(!beaconManager.isBluetoothEnabled()) {
            final Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(intent, REQUEST_CODE_ENABLE_BLUETOOTH);
        } else if(beaconManager.isConnected()) {
            try {
                beaconManager.startRanging();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        } else {
            connect();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        beaconManager.stopMonitoring();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        beaconManager.disconnect();
        beaconManager = null;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == REQUEST_CODE_ENABLE_BLUETOOTH) {
            if(resultCode == Activity.RESULT_OK) {
                connect();
            } else {
                Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_LONG).show();
                getActionBar().setSubtitle("Bluetooth not enabled");
            }
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    private void connect() {
        try {
            beaconManager.connect(new OnServiceBoundListener() {
                @Override
                public void onServiceBound() {
                    try {
                        beaconManager.startMonitoring();
                        //beaconManager.startMonitoring(Region.EVERYWHERE);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (RemoteException e) {
            throw new IllegalStateException(e);
        }
    }
}

我在错误的函数中扫描信标吗? 请帮忙

  1. onStart() 中调用 BeaconManager.startRanging()。相反,在 onStop() 中调用 BeaconManager.stopMonitoring().

嗯,这样不行。您可以范围或监控。您不能同时执行两种扫描。混合测距和监视会引发异常。

虽然 ranging 您关注与您感兴趣的远程设备的物理距离。

然而,如果您 monitor 他们,您更想知道他们是否在附近。换句话说,你是否在特定地区。

  1. 我看到您想在从 IMMEDIATE 距离找到具有特定次要值的信标后执行代码。虽然您编写的内容应该有效,但这并不是解决问题的首选方法。您可以通过 Filters.newMajorFilter()Filters.CustomFilter
  2. 启用对特定值的过滤,例如次要值

你看过kontakt-beacon-sample-admin-app吗?该项目演示了 kontakt.io 的 Android SDK 用法的不同方法。