如何从信标获取ID或主要或次要信息?

时间:2019-01-25 17:39:28

标签: java android beacon altbeacon

此代码检测到一个信标,但我无法从中获取ID或主要或次要信息。我尝试使用beacon.id1()函数,但始终返回null。 自3天以来,我一直在尝试实施此操作,但是我无法确定我是信标技术的新手。我想从信标中获取ID。 此代码检测到一个信标,但我无法从中获取ID或主要或次要信息。我尝试使用beacon.id1()函数,但始终返回null。 自3天以来,我一直在尝试实施此操作,但是我无法确定我是信标技术的新手。我想从信标中获取ID。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    beaconManager = BeaconManager.getInstanceForApplication(this);

     beaconManager.getBeaconParsers().add(new BeaconParser().
           setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));

    beaconManager.bind( this);


    ToggleButton toggle = (ToggleButton) findViewById(R.id.togglebutton);
    toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                // The toggle is enabled
                Intent eintent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                int intVal=1;
                startActivityForResult(eintent, intVal);
            } else {
                // The toggle is disabled
                BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
                bAdapter.disable();
            }
        }
    });


}
@Override
protected void onDestroy() {
    super.onDestroy();
    beaconManager.unbind((BeaconConsumer) this);
}

public void onBeaconServiceConnect() {
    beaconManager.removeAllMonitorNotifiers();
    beaconManager.addMonitorNotifier(new MonitorNotifier() {


        @Override
        public void didEnterRegion(Region region) {
            Context context = getApplicationContext();
            CharSequence text = "Beacon Found";
            int duration = Toast.LENGTH_LONG;

            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
            Log.d(TAG, "I just saw a beacon for the first time!");

            a=beacon.getServiceUuid();

            Toast toastt = Toast.makeText(context,"" + a, duration);
            toastt.show();
        }

        @Override
        public void didExitRegion(org.altbeacon.beacon.Region region) {
            Log.i(TAG, "I no longer see a beacon");
        }

        @Override
        public void didDetermineStateForRegion(int i, org.altbeacon.beacon.Region region) {
            //Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
        }

    });

   try {
        beaconManager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));
        //beaconManager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("myranging", null, null, null));
    }
    catch (RemoteException e) {    }
}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {

}

1 个答案:

答案 0 :(得分:0)

了解使用监视API,只有在任何信标(一个或多个)位于与您的Region定义相匹配的附近时,您才会获得回调。所示代码定义了将所有标识符设置为null的区域。这就是所谓的通配符区域,因为它与任何信标都匹配。

当您收到对didEnterRegion的回调时,它将传递与您开始监视相同的Region定义的副本。并且由于将所有标识符都设置为null(通配符定义),这就是检查传递给该方法的Region对象的标识符时得到的。这些API旨在告诉您何时出现信标的中的任何一个。

如果您想知道可见信标的特定标识符,则只需使用范围API。代替:

beaconManager.startMonitoringBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));

致电:

 beaconManager.startRangingBeaconsInRegion(new org.altbeacon.beacon.Region("MY_UUID", null, null, null));

然后按如下所示设置您的回调通知程序:

beaconManager.addRangeNotifier(new RangeNotifier() {
    @Override
    public void didRangeBeaconsInRegion(Region region, Collection<Beacon> beacons) {
        for (Beacon beacon: beacons} {
          Log.d(TAG, "I see a beacon with ID1 of: "+beacon.getID1());
        }
    }
});