首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kontakt.io iBeacon在Android上被扫描的间隔太长了

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

Stack Overflow用户
提问于 2015-05-08 10:35:44
回答 1查看 834关注 0票数 0

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

代码语言:javascript
复制
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);
        }
    }
}

我是不是在扫描错误的信标?请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 09:21:05

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

嗯,这不是那样的。你既可以瞄准也可以监视。你不能同时进行两次扫描。混合测距和监测结果出现异常。

ranging则专注于与您感兴趣的远程设备之间的物理距离。

然而,如果您monitor他们,您希望得到通知,他们是否在附近。换句话说,不管你是否在特定的区域。

  1. 我看到,一旦从IMMEDIATE距离找到具有特定次要值的信标,就需要执行代码。虽然你所写的应该有效,但解决它并不是更好的方法。您可以通过Filters.newMajorFilter()或通过Filters.CustomFilter对特定值(如未成年人)启用筛选。

你见过kontakt-信标-样本-管理-应用程序吗?这个项目演示了kontakt.io的Android使用的不同方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30121701

复制
相关文章

相似问题

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