当新的Android Intent打开时,测距信号停止

时间:2014-10-29 18:45:50

标签: android android-asynctask ibeacon ibeacon-android altbeacon

我创建了一个应用程序,它可以在三个以上信标范围不等的情况下对信标进行范围并计算位置。

问题是,当我想显示位置时,启动新的Intent是必要的,因此主要活动仍然不在Foreground中。大约5秒后,信标的范围停止,我的位置计算也因为信标的距离不再发生变化。

是否有可能继续测距信标?我已尝试在我的主要活动中启动异步任务,但它不起作用,可能有错误,我不知道。

这是我的异步任务代码和OnBeaconServiceConnect():

public class Monitor_Screen extends Activity implements BeaconConsumer,
    SensorEventListener {

private class asyncThread extends AsyncTask<Activity, Void, BeaconManager> {


    @Override
    protected BeaconManager doInBackground(Activity... arg0) {
        // TODO Auto-generated method stub

        Thread.currentThread().setName("BeaconManagerThread");

        Application myApplication = new Application();
        // BeaconManager
        myBeaconManager = BeaconManager.getInstanceForApplication(myApplication);
        myBeaconManager
                .getBeaconParsers()
                .add(new BeaconParser()
                        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
        myBeaconManager.setBackgroundScanPeriod(TimeUnit.SECONDS.toMillis(1));
        myBeaconManager.bind(Monitor_Screen.this);



        // Region
        myRegion = new Region("all beacons", null, null, null); 
        startService(Monitor_Screen.this.getIntent());
        return myBeaconManager;
    }

}

@Override
public void onBeaconServiceConnect() {
    // // range beacons on connect

    try {
        myBeaconManager.startRangingBeaconsInRegion(myRegion);
    } catch (RemoteException e) {
        Toast.makeText(getApplicationContext(), e.getMessage(),
                Toast.LENGTH_LONG).show();
    }
    myBeaconManager.setRangeNotifier(new RangeNotifier() {

        public void didRangeBeaconsInRegion(Collection<Beacon> beacons,
                Region myRegion) {

            if (beacons.size() > 0) {
                Iterator<Beacon> myIterator = beacons.iterator();
                while (myIterator.hasNext()) {
                    Beacon tempBeacon = myIterator.next();
                    MyBeacon myBeacon = new MyBeacon(tempBeacon.getId1(),
                            tempBeacon.getId2(), tempBeacon.getId3(),
                            tempBeacon.getBluetoothAddress(), tempBeacon
                                    .getRssi(), tempBeacon.getDistance(),
                            tempBeacon.getTxPower(), System
                                    .currentTimeMillis(),
                            new Position(0, 0));
                    boolean isIn = false;
                    for (MyBeacon blub : myVector) {
                        if (blub.getBTAdress().equals(
                                myBeacon.getBTAdress())) {
                            isIn = true;
                            blub.distance = myBeacon.getDistance();
                        }
                    }
                    if (!isIn)
                        myVector.add(myBeacon);
                }
            }

            logBeaconData();
            for (int i = 0; i < myVector.size(); i++) {
                if (System.currentTimeMillis()
                        - myVector.get(i).getTimeStamp() > 10000) {
                    myVector.remove(i);
                }
            }
        }
    });

    try {
        myBeaconManager.startMonitoringBeaconsInRegion(myRegion);
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    myBeaconManager.setMonitorNotifier(new MonitorNotifier() {

        @Override
        public void didExitRegion(Region arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void didEnterRegion(Region arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void didDetermineStateForRegion(int arg0, Region arg1) {
            // TODO Auto-generated method stub

        }
    });

}

1 个答案:

答案 0 :(得分:0)

在后台继续进行信标测距的最简单方法是在自定义android.app.Application类中设置信标范围,并将回调转发到Activity以仅更新显示Activity位于前台。

您可以在Android Beacon Libraryhttps://github.com/AltBeacon/android-beacon-library-reference参考申请中看到这样做的示例:{{3}}

以下是自定义android.app.Application类的摘录,其中设置了此类。请注意,范围设置一次,并将在应用程序的整个生命周期中继续。范围回调如果存在则传递给mRangingActivity,因此它可以进行任何必要的UI处理。

public class BeaconReferenceApplication extends Application implements BootstrapNotifier, RangeNotifier {
...

    public void onCreate() {
        mAllBeaconsRegion = new Region("all beacons", null, null, null);
        mBeaconManager = BeaconManager.getInstanceForApplication(this);
        mBackgroundPowerSaver = new BackgroundPowerSaver(this);     
        mRegionBootstrap = new RegionBootstrap(this, mAllBeaconsRegion);
    }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> arg0, Region arg1) {
        if (mRangingActivity != null) {
            mRangingActivity.didRangeBeaconsInRegion(arg0, arg1);
        }

    }

    @Override
    public void didEnterRegion(Region arg0) {
        try {
            Log.d(TAG, "entered region.  starting ranging");
            mBeaconManager.startRangingBeaconsInRegion(mAllBeaconsRegion);
            mBeaconManager.setRangeNotifier(this);
        } catch (RemoteException e) {
            Log.e(TAG, "Cannot start ranging");
        }
    }

...
}