Android 信标库 - 开始测距的最少步骤

Android beacon library - minimum steps to start ranging

我想在我的应用程序中添加最简单的程序。该程序应仅在单击对话框选项后获取信标信息,我多次尝试编写代码但没有得到开始测距所需的最少步骤是多少。

public class SecondClass extends Activity implements BeaconConsumer {
private BeaconManager beaconManager;
protected static final String TAG = "RangingActivity";
RegionBootstrap regionBootstrap;

Region region;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);

    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"));
    beaconManager.bind(this);

    region = new Region("backgroundRegion", null, null, null);

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.cancel(101); //closes notification

    //opens the alert dialog
    AlertDialog.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert);
    } else {
        builder = new AlertDialog.Builder(this);
    }
    builder.setTitle("Send data")
            .setMessage("Are you sure you want to send your data to the server?")
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    // if yes was pressed, send the data

                    try {
                        beaconManager.startRangingBeaconsInRegion(region);
                    } catch (RemoteException e) {
                        Log.d(TAG, "Can't start ranging");
                    }

                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // if cancel was pressed, do nothing

                }
            })
            .setIcon(android.R.drawable.ic_dialog_alert)
            .show();
}


@Override
public void onBeaconServiceConnect() {

    beaconManager.addRangeNotifier(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.");
            }
        }
    });
}
}

谁能解释一下 onBeaconServiceConnect 是如何运行的?我是否需要在开始测距之前进行监控过程,检查是否有信标以及是否有信标才能开始测距,或者只需要一个程序就可以测距?

我尝试按照 Android Beacon Library 示例代码部分中的描述进行操作,但没有成功

此致

编辑

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

将这些权限添加到代码中,但仍然不起作用

我做的另一件事是使用 here(第二个投票最多的答案)

中描述的功能检查是否启用了 ACCESS_COARSE_LOCATION

自己测距就可以了。

onBeaconServiceConnect 是在您调用 beaconManager.bind(this); 之后信标扫描服务准备就绪时进行的回调。回调表明您已准备好开始测距或监控。确保您收到此回调。

  • 确保您可以检测到与 BeaconScope 等现成信标检测相同的信标:https://play.google.com/store/apps/details?id=com.davidgyoungtech.beaconscanner&hl=en_US

  • 如果使用 iBeacon、Eddystone 或自定义信标格式。确保您已注册正确的 BeaconParser 以使用该库。这是 iBeacon 的代码:beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); Eddystone 有不同的布局。

  • 如果您在 Android 6+ 上进行测试,请确保您已通过编程方式请求并获得用户的位置权限,否则检测将阻止。 http://altbeacon.github.io/android-beacon-library/requesting_permission.html

  • 确保蓝牙已打开,已为 phone。

  • 启用定位
  • 如果在 Android 10+ 上,请确保您已获得 FINE_LOCATION 许可,因为 COARSE_LOCATION 不再足够。

问题是:在示例代码中我认为它已经为 iBeacons 指定了,所以我保持原样...更改为

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

为我正在使用的信标工作