2

我創建了一個應用程序,該信號範圍信標並計算超過三個信標範圍時的位置。當新的Android Intent開啓時,測距信號停止

問題是,當我想顯示位置時,有必要啓動一個新的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 

     } 
    }); 

} 

回答

0

有燈塔測距繼續在後臺運行的最簡單的方法是設置燈塔範圍在自定義android.app.Application類,並有它只會在Activity位於前臺時將回調轉發給您的Activity以更新顯示。

你可以看到在這裏Android Beacon Library參考應用這樣的例子:https://github.com/AltBeacon/android-beacon-library-reference

下面是從這個地方設置了自定義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"); 
     } 
    } 

... 
} 
+0

不幸的是,這種解決方案不適合我。我開始了一個新項目並測試了ReferenceApplication,但它不起作用。應用程序崩潰:( – 2014-10-30 09:25:28

+0

嘗試運行參考應用程序的未修改版本。如果看到崩潰,請將鏈接粘貼到堆棧跟蹤。 – davidgyoung 2014-10-30 12:04:48