簡體   English   中英

找不到任何帶有 altbeacon android 的信標

[英]Could not found any beacon with altbeacon android

我正在為 android 使用 altbeacon,但我無法檢測到我的信標。 我也嘗試過https://github.com/AltBeacon/android-beacon-library-reference示例代碼,但無法檢測到信標。 這是我的代碼:

公共類 BeaconApplication 擴展應用程序實現 BootstrapNotifier {

private Region region;
private RegionBootstrap regionBootstrap;
private BeaconManager beaconManager;

@Override
public void onCreate() {
    super.onCreate();
    beaconManager = BeaconManager.getInstanceForApplication(this);
    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.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.setBackgroundScanPeriod(5000);
    beaconManager.setBackgroundBetweenScanPeriod(10000);
    region = new Region("backgroundRegion",
            Identifier.parse("EBEFD083-70A2-47C8-9837-E7B5634DF524"), null, null);
    regionBootstrap = new RegionBootstrap(this, region);
    Log.i("selfBeacon", "Bootstrap created");
}

@Override
public void didEnterRegion(Region region) {
    Log.i("selfBeacon", "Bootstrap didEnterRegion");
    regionBootstrap.disable();
    Intent intent = new Intent(this, SelfBeaconService.class);
    if (Build.VERSION.SDK_INT >= 26) {
        startForegroundService(intent);
    } else {
        startService(intent);
    }
    Log.i("selfBeacon", "Service start commanded");
}

@Override
public void didExitRegion(Region region) {

}

@Override
public void didDetermineStateForRegion(int i, Region region) {

}

public void resumeScanning () {
    beaconManager.setBackgroundScanPeriod(5000);
    beaconManager.setBackgroundBetweenScanPeriod(10000);
    regionBootstrap = new RegionBootstrap(this, region);
    Log.i("selfBeacon", "scanning resumed");
}

}

公共類 SelfBeaconService 擴展服務實現 BeaconConsumer {

private BeaconManager beaconManager;
private Region region;
private int noBeaconDetectedCount = 0;

@Override
public void onCreate() {
    super.onCreate();
    Log.i("selfBeaconService", "onCreate");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("selfBeaconService", "onStartCommand");
    broadcastSystemLog("Beacon Service onCreate triggered.");
    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.setEnableScheduledScanJobs(false); //Stop scanning
    beaconManager.setForegroundScanPeriod(2000);
    beaconManager.setForegroundBetweenScanPeriod(2000);
    beaconManager.bind(this);
    region = new Region("foreground region",
            Identifier.parse("EBEFD083-70A2-47C8-9837-E7B5634DF524"), null, null);

    startForeground();

    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onBeaconServiceConnect() {
    Log.i("selfBeaconService", "onBeaconServiceConnect");
    broadcastSystemLog("onBeaconServiceConnect triggered.");
    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
            if (collection.size() > 0) {
                noBeaconDetectedCount = 0;
                double closestDistance = -1;
                for (Beacon each : collection) {
                    if (closestDistance == -1) {
                        closestDistance = each.getDistance();
                    } else if (each.getDistance() < closestDistance) {
                        closestDistance = each.getDistance();
                    }
                }
                Log.i("selfBeaconService", "didRangeBeaconsInRegion, the closest beacon is about " +
                        closestDistance + " meters away.");
                broadcastToActivity("The closest beacon is about " +
                        closestDistance + " meters away.");
            } else {
                noBeaconDetectedCount++;
                broadcastToActivity("No beacon has been detected for " + noBeaconDetectedCount + " times");
                if (noBeaconDetectedCount > 10) { //10*(2000ms+2000ms) = 40 seconds
                    stopForeground(true);
                    terminate();
                }
            }
        }
    });

    try {
        beaconManager.startRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

@Override
public void onDestroy() {
    Log.i("selfBeacon", "onDestroy");
    broadcastSystemLog("BeaconService onDestroy triggered.");
    super.onDestroy();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

private void broadcastToActivity (String message) {
    Intent intent = new Intent();
    intent.setAction("beaconBroadcast");
    intent.putExtra("beaconService", message);
    sendBroadcast(intent);
}

private void broadcastSystemLog (String message) {
    Intent intent = new Intent();
    intent.setAction("beaconBroadcast");
    intent.putExtra("beaconServiceLog", message);
    sendBroadcast(intent);
}

private void startForeground () {
    NotificationCompat.Builder notificationBuilder = null;
    Notification notification = null;
    if (Build.VERSION.SDK_INT >= 26) {
        notificationBuilder = new NotificationCompat.Builder(this, "rangingService")
                .setContentTitle("Active Scanning")
                .setContentText("App is scanning for nearby beacons");
        notification = notificationBuilder.build();
    } else {
        notificationBuilder = new NotificationCompat.Builder(this)
                .setContentTitle("Active Scanning")
                .setContentText("App is scanning for nearby beacons");
        notification = notificationBuilder.build();
    }
    startForeground(1234, notification);
}

private void terminate () {
    try {
        beaconManager.stopRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
    beaconManager.removeAllRangeNotifiers();
    beaconManager.unbind(this);
    beaconManager.setEnableScheduledScanJobs(true);
    ((BeaconApplication)getApplication()).resumeScanning();
    stopSelf();
    Log.i("selfBeaconService", "service stopped");
    broadcastSystemLog("BeaconSevice stopped.");
}

}

需要檢查的幾件事:

  1. 確保您已添加代碼以在運行時動態請求位置權限。 請參閱此處了解如何執行此操作。
  2. 添加上述內容后,請確保已正確獲取此權限。 去。 設置->應用程序->{您的應用程序名稱}->查看權限
  3. 確保您的手機上啟用了藍牙和定位功能。
  4. 如果您已經檢查了以上所有內容,但它仍然不起作用,請嘗試使用現成的信標檢測器,例如BeaconScope 如果未檢測到,則您的手機硬件或信標硬件可能存在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM