Android 在前景和背景中检测iBeacon时,AltBeacon库不稳定

Android 在前景和背景中检测iBeacon时,AltBeacon库不稳定,android,ibeacon,altbeacon,Android,Ibeacon,Altbeacon,我完全遵循了及其教程中的步骤,为我的应用程序在前台和后台进行iBeacon检测 实际上,我的应用程序确实检测到了iBeacons。我将在检测到iBeacon后发送通知 但是,测距过程可能会在几分钟后突然停止,无论我的应用程序是在前台还是后台(尤其是当设备锁定时) 有时,它会重新启动检测(i)在我重新打开设备中的蓝牙后,(ii)在我重新启动应用程序后。但有时不会 我在我的应用程序的自定义应用程序中实现了BootstrapNotifier和RangeNotifier。下面是一些代码片段 MyAppl

我完全遵循了及其教程中的步骤,为我的应用程序在前台和后台进行iBeacon检测

实际上,我的应用程序确实检测到了iBeacons。我将在检测到iBeacon后发送通知

但是,测距过程可能会在几分钟后突然停止,无论我的应用程序是在前台还是后台(尤其是当设备锁定时)

有时,它会重新启动检测(i)在我重新打开设备中的蓝牙后,(ii)在我重新启动应用程序后。但有时不会

我在我的应用程序的自定义应用程序中实现了BootstrapNotifier和RangeNotifier。下面是一些代码片段

MyApplication.java

public class MyApplication extends Application implements BootstrapNotifier, RangeNotifier {
private static final String TAG = "MyApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private int notificationID = 0;

@Override
public void onCreate() {
    super.onCreate();

    BeaconManager 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.setBackgroundScanPeriod(1100l);
    beaconManager.setBackgroundBetweenScanPeriod(1100l);

    Region region = new Region("MyRegion", null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);

    backgroundPowerSaver = new BackgroundPowerSaver(this);
}

@Override
public void didEnterRegion(Region region) {
    BeaconManager.getInstanceForApplication(this).setRangeNotifier(this);
    try {
        BeaconManager.getInstanceForApplication(this).startRangingBeaconsInRegion(region);
    }
    catch (RemoteException e) {
        Log.e(TAG, "Can't start ranging");
    }
}

@Override
public void didExitRegion(Region region) {

}

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

}

private void sendNotification(Beacon beacon) {
    String message = beacon.getId3().toString();

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher).setContentTitle("Where")
            .setContentText(message).setAutoCancel(true);
    Intent intent = new Intent(this, RDMainActivity.class);
    intent.putExtra("Beacon", beacon);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(), notificationID, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(notificationID++, mBuilder.build());
}

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    for (Beacon beacon : beacons) {
        sendNotification(beacon);
    }
}

您正在使用的设备是什么?我在星系S3上观察到了同样的问题。看起来蓝牙协议栈只是崩溃了。您可能想尝试增加扫描周期,看看这是否有帮助。您能在上次检测后发布一段5秒的Logcat摘录吗?前景摘录可能是最有用的。@DavidYoung谢谢你的建议。正如你所说,我已经发布了日志。我以前没有注意到这个例外。你知道这个异常吗?你能看到在运行Locate应用程序时是否出现同样的异常吗?
02-06 20:25:28.795  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:28.815  19482-19482/com.myapp W/CycledLeScanner﹕ Internal Android exception scanning for beacons
    java.lang.NullPointerException
            at android.os.Parcel.readException(Parcel.java:1471)
            at android.os.Parcel.readException(Parcel.java:1419)
            at android.bluetooth.IBluetoothGatt$Stub$Proxy.stopScan(IBluetoothGatt.java:771)
            at android.bluetooth.BluetoothAdapter$GattCallbackWrapper.stopLeScan(BluetoothAdapter.java:1819)
            at android.bluetooth.BluetoothAdapter.stopLeScan(BluetoothAdapter.java:1722)
            at org.altbeacon.beacon.service.scanner.CycledLeScannerForJellyBeanMr2.finishScan(CycledLeScannerForJellyBeanMr2.java:67)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:249)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:234)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:230)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
02-06 20:25:29.936  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:29.936  19482-19482/com.myapp D/BluetoothAdapter﹕ startLeScan(): null
02-06 20:25:29.956  19482-19493/com.myapp D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=8
02-06 20:25:31.087  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:31.097  19482-19482/com.myapp W/CycledLeScanner﹕ Internal Android exception scanning for beacons
    java.lang.NullPointerException
            at android.os.Parcel.readException(Parcel.java:1471)
            at android.os.Parcel.readException(Parcel.java:1419)
            at android.bluetooth.IBluetoothGatt$Stub$Proxy.stopScan(IBluetoothGatt.java:771)
            at android.bluetooth.BluetoothAdapter$GattCallbackWrapper.stopLeScan(BluetoothAdapter.java:1819)
            at android.bluetooth.BluetoothAdapter.stopLeScan(BluetoothAdapter.java:1722)
            at org.altbeacon.beacon.service.scanner.CycledLeScannerForJellyBeanMr2.finishScan(CycledLeScannerForJellyBeanMr2.java:67)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:249)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:234)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:230)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
02-06 20:25:32.218  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:32.218  19482-19482/com.myapp D/BluetoothAdapter﹕ startLeScan(): null
02-06 20:25:32.228  19482-19493/com.myapp D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=9
02-06 20:25:33.360  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:33.370  19482-19482/com.myapp W/CycledLeScanner﹕ Internal Android exception scanning for beacons
    java.lang.NullPointerException
            at android.os.Parcel.readException(Parcel.java:1471)
            at android.os.Parcel.readException(Parcel.java:1419)
            at android.bluetooth.IBluetoothGatt$Stub$Proxy.stopScan(IBluetoothGatt.java:771)
            at android.bluetooth.BluetoothAdapter$GattCallbackWrapper.stopLeScan(BluetoothAdapter.java:1819)
            at android.bluetooth.BluetoothAdapter.stopLeScan(BluetoothAdapter.java:1722)
            at org.altbeacon.beacon.service.scanner.CycledLeScannerForJellyBeanMr2.finishScan(CycledLeScannerForJellyBeanMr2.java:67)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:249)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:234)
            at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:230)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
02-06 20:25:34.521  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()
02-06 20:25:34.521  19482-19482/com.myapp D/BluetoothAdapter﹕ startLeScan(): null
02-06 20:25:34.551  19482-19493/com.myapp D/BluetoothAdapter﹕ onClientRegistered() - status=133 clientIf=0
02-06 20:25:35.652  19482-19482/com.myapp D/BluetoothAdapter﹕ stopLeScan()