2015-05-08 26 views
0

我买了3 kontakt.io iBeacon,我没有问题创建的代码,以便在IOS上扫描它们,但对于Android我有一些问题.. 该错误是,我能够正确扫描iBeacons一次,但之后,他们并没有得到了扫描或他们得到的很长一段时间后,扫描,这是到目前为止,我使用的代码:Kontakt.io iBeacon扫描在Android上的间隔太多

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
  1. onStart()调用BeaconManager.startRanging()。相反,您在onStop()中调用BeaconManager.stopMonitoring()

那么,这不行。您可以选择范围或监视。您无法同时执行两个扫描。混合测距和监测会导致异常情况发生。

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

鉴于,如果你monitor他们,你想要被通知他们是否在附近或没有。换句话说,不管你是否在特定地区。

  1. 我看到您想要执行代码,只要您找到距离为IMMEDIATE的特定次要值的信标。尽管你写的东西应该工作,但解决问题并不是最好的方法。您可以通过Filters.newMajorFilter()启用像轻微的特定值过滤,或通过Filters.CustomFilter

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

+0

有很多帮助!你能解释一下为什么同时执行这两种方法是不正确的吗? 当我找到一个灯塔并询问用户他是否想继续扫描时(通过这种方式我没有任何延迟发现灯塔),我通过使用stopMonitoring()和startMonitoring()得到了代码工作,您认为有更清晰的解决方案? Ty为链接。我很快就会查出来的! – Signo

+1

我已经更新了我的答案。有关更多信息,请参阅http://docs.kontakt.io或https://github.com/kontaktio –

+0

好的非常感谢您的帮助! – Signo