使用 Altbeacon 检测信标列表

Detect list of beacon with Altbeacon

我正在尝试使用 Android 信标库获取附近信标的列表。我一直在关注这个sample,但作为一个新手,我发现它太复杂了。我不想检测背景中的信标,我不想检测区域条目……我只想拥有实际可见信标的列表。 在我的 MainActivity class 的 onCreate 方法中,我刚刚添加了这段代码,并希望这将启动测距或监控,但这并没有发生。有人知道问题是什么或如何使用这两个 classes 吗?

public class MainActivity extends AppCompatActivity {
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        MonitoringActivity monitoringActivity = new MonitoringActivity();
        RangingActivity rangingActivity = new RangingActivity();

    }

    @Override

如果您只想获取可见信标列表,则需要信标 "ranging"。您不需要使用示例中提到的两个单独的 Activity classes。您可以将 Ranging 示例的相关部分复制到您自己的 Activity 中。

所以这样做:

  1. 从您的 class 中删除对 MonitoringActivityRangingActivity 的引用。

  2. 将以下内容添加到您的 class 中:

将您的 class 定义更改为:

public class MainActivity extends AppCompatActivity implements BeaconConsumer {

将以下代码添加到您的 onCreate 方法中:

    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    // To detect proprietary beacons, you must add a line like below corresponding to your beacon
    // type.  Do a web search for "setBeaconLayout" to get the proper expression.
    // beaconManager.getBeaconParsers().add(new BeaconParser().
    //        setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
    beaconManager.bind(this);

将以下方法添加到您的class:

@Override
public void onBeaconServiceConnect() {
    BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.setRangeNotifier(new RangeNotifier() {
        @Override 
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            for (Beacon beacon : beacons) {
                Log.i("MainActivity", "I see a beacon that is about "+beacon.getDistance()+" meters away.");        
            }
        }
    });

    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
    } catch (RemoteException e) {    }
}

可见信标列表是在 for (Beacon beacon : beacons) 行内访问的内容。