Altbeacon - 监控或测距都没有错误

时间:2015-06-11 08:46:54

标签: android bluetooth-lowenergy ibeacon altbeacon

我的代码如下(取自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

3 个答案:

答案 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));