AltBeacon 看不到 eddystone 设备

AltBeacon does not see eddystone device

大家好,我使用 Android API 使用信标已有一段时间,我能够检测到我所有的信标,其中之一是 URL 中的 Eddystone,事实上图书馆 'com.neovisionaries:nvbluetooth:1.8' 承认它是这样的。但是当使用 AltBeacon 库时没有找到设备,甚至没有我设置解析器的 Eddystone

public class MainActivity extends Activity implements BeaconConsumer {

protected static final String TAG = "MonitoringActivity";
private BeaconManager beaconManager;

private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;
private static final int PERMISSION_REQUEST_BACKGROUND_LOCATION = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    checkLocationPermission();
    beaconManager = BeaconManager.getInstanceForApplication(this);
    // Detect the main identifier (UID) frame:
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
    // Detect the telemetry (TLM) frame:
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout(BeaconParser.EDDYSTONE_TLM_LAYOUT));
    // Detect the URL frame:
    beaconManager.getBeaconParsers().add(new BeaconParser().
            setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT));


    beaconManager.bind(this);
}

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

@Override
public void onBeaconServiceConnect() {
    beaconManager.removeAllMonitorNotifiers();
    beaconManager.addMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            Log.i(TAG, "I just saw an beacon for the first time!");
        }

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

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

    try {
        beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));
    } catch (RemoteException ignored) {    }
}

private void checkLocationPermission() {
    if (this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        if (this.checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            if (this.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("This app needs background location access");
                builder.setMessage("Please grant location access so this app can detect beacons in the background.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(dialog ->
                        requestPermissions(new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                                PERMISSION_REQUEST_BACKGROUND_LOCATION));
                builder.show();
            } else {
                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Functionality limited");
                builder.setMessage("Since background location access has not been granted, this app will not be able to discover beacons in the background.  Please go to Settings -> Applications -> Permissions and grant background location access to this app.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(dialog -> {});
                builder.show();
            }

        }
    } else {
        if (!this.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                    PERMISSION_REQUEST_FINE_LOCATION);
        } else {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Functionality limited");
            builder.setMessage("Since location access has not been granted, this app will not be able to discover beacons.  Please go to Settings -> Applications -> Permissions and grant location access to this app.");
            builder.setPositiveButton(android.R.string.ok, null);
            builder.setOnDismissListener(dialog -> {});
            builder.show();
        }
    }
}

代码是直接从示例代码中复制的,我添加的唯一新部分是 checklocation 函数,我添加它是为了修复 phone 时没有正确给我权限的问题仅使用清单(正如我在使用原始 API 时发现的那样)

另外作为额外信息:我的构建文件设置如下:minSdkVersion 24 targetSdkVersion 30

知道为什么我的代码不起作用吗?

谢谢

编辑额外信息来自 https://altbeacon.github.io/android-beacon-library/detection-trouble.html

  1. NRF 发现信标为 Eddystone V3.0
  2. Checkbluetooth 函数正是这样做的,我确认它正在正确获取权限(基于我使用 android API 构建的并行应用程序)
  3. 是(见上文)
  4. 是(见上面的代码)
  5. 不是三星,是 BLU Grand M2

显然代码有效,关闭 phone 并重新打开修复它不知道为什么会这样