我的代码如下(取自here)
public class MainActivity extends ActionBarActivity implements ROXIMITYEngineListener, BeaconConsumer {
private final String TAG = "MainActivity";
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
beaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
Log.i(TAG, "onBeaconServiceConnect");
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.i(TAG, "I just saw an beacon for the first time!");
Toast.makeText(MainActivity.this, "I just saw an beacon for the first time!", Toast.LENGTH_LONG).show();
}
@Override
public void didExitRegion(Region region) {
Log.i(TAG, "I no longer see an beacon");
Toast.makeText(MainActivity.this, "I no longer see an beacon", Toast.LENGTH_LONG).show();
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
Toast.makeText(MainActivity.this, "I have just switched from seeing/not seeing beacons: "+state, Toast.LENGTH_LONG).show();
}
});
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.");
Toast.makeText(MainActivity.this, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.", Toast.LENGTH_LONG).show();
}
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("uniqueid1", null, null, null));
beaconManager.startRangingBeaconsInRegion(new Region("uniqueid2", null, null, null));
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
}
}
onBeaconServiceConnected
确实被称为!但没有其他任何东西被称为/打印。没有错误抛出。
我错过了什么?
同一个人(Radius Networks)的这个app可以检测到我的灯塔,为什么我的应用程序不能这样做呢?
我的手机是运行Android 5.1的Nexus 5。我正在使用Android Beacon Library 2.1.4,而我正在使用Android Studio版本1.2.1.1 (我认为这不重要,但我的灯塔是Roximity Model X)
我也尝试过只进行监控,但它也没有。
有趣的是,当我看到没有过滤器的logcat时,我可以看到BtGatt正在进行扫描并检测到信标:
06-11 17:06:01.413 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - queue=1
06-11 17:06:01.413 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - ScanSetting Scan mode=2 mLastConfiguredScanSetting=-2147483648
06-11 17:06:02.515 2828-2845/? D/BtGatt.GattService﹕ stopScan() - queue size =1
06-11 17:06:02.517 2828-2922/? D/BtGatt.ScanManager﹕ stop scan
06-11 17:06:02.520 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - queue=0
06-11 17:06:02.520 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - ScanSetting Scan mode=-2147483648 mLastConfiguredScanSetting=2
06-11 17:06:02.520 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - queue emtpy, scan stopped
06-11 17:06:02.521 2828-3062/? D/BtGatt.GattService﹕ unregisterClient() - clientIf=5
06-11 17:06:02.527 2828-3062/? D/BtGatt.GattService﹕ registerClient() - UUID=a6ef652b-0423-4049-8079-8c784d8a22ec
06-11 17:06:02.527 2828-2900/? D/BtGatt.GattService﹕ onClientRegistered() - UUID=a6ef652b-0423-4049-8079-8c784d8a22ec, clientIf=5
06-11 17:06:02.527 2902-2937/? D/BluetoothLeScanner﹕ onClientRegistered() - status=0 clientIf=5
06-11 17:06:02.529 2828-2905/? D/BtGatt.GattService﹕ start scan with filters
06-11 17:06:02.530 2828-2922/? D/BtGatt.ScanManager﹕ handling starting scan
06-11 17:06:02.532 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - queue=1
06-11 17:06:02.532 2828-2922/? D/BtGatt.ScanManager﹕ configureRegularScanParams() - ScanSetting Scan mode=2 mLastConfiguredScanSetting=-2147483648
06-11 17:06:03.634 2828-2845/? D/BtGatt.GattService﹕ stopScan() - queue size =1
06-11 17:06:03.636 2828-2922/? D/BtGatt.ScanManager﹕ stop scan
答案 0 :(得分:1)
我的猜测是你正在尝试检测专有信标(例如iBeacon)。因为库是开源的,所以默认情况下它不会检测专有信标,因为这样做会要求我们发布专有的信标格式。这可能会导致法律问题。
修复很简单。您只需要在onCreate
方法中添加一行代码,以设置专有信标类型所需的信标解析器。
Google搜索“getbeaconparsers”,您会看到要添加的代码行。
答案 1 :(得分:1)
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
beaconManager = BeaconManager.getInstanceForApplication(this);
//layout of ibeacon
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
...
}
答案 2 :(得分:0)
您的监控和测距区域名称应相同。 试试这个:
beaconManager.startMonitoringBeaconsInRegion(new Region("uniqueid1", null, null, null));
beaconManager.startRangingBeaconsInRegion(new Region("uniqueid1", null, null, null));