2

AltBeacon 参照アプリとそのチュートリアルの手順に完全に従い、アプリのフォアグラウンドとバックグラウンドの両方で iBeacon を検出しました。

実際、私のアプリは iBeacons を検出します。iBeacon を検出したら通知を送信します。

ただし、アプリがフォアグラウンドまたはバックグラウンドであっても (特にデバイスがロックされている場合)、測距プロセスが数分後に突然停止することがあります。

場合によっては、(i) デバイスの Bluetooth を再度オンにした後、(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);
    }
}

私のテスト デバイスは、Android4.4.4 を搭載した Nexus 7 (2013 Mobile バージョン) です。

この問題について何か考えている人はいますか?どんな助けでも大歓迎です。

更新:フォアグラウンドでの最後の検出後のlogcatは次のとおりです

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()
4

0 に答える 0