簡體   English   中英

Android信標庫-BLE信標檢測不起作用

[英]Android Beacon Library - BLE beacons detecting is not working

我正在嘗試使用Android中的Android信標庫檢測信標。 我創建了一個在后台運行並檢測信標的服務。

問題是藍牙關閉時,應用程序未檢測到信標。 但是,如果我打開藍牙,則它可以正常工作。 還有一件很奇怪的事情。 如果我在應用程序運行時再次關閉藍牙,它仍會繼續檢測。 這意味着BLE檢測有效,但僅當我打開藍牙並再次將其關閉時才起作用。

如何啟用BLE檢測? 下面是我的實現。 我想念什么嗎?

信標服務等級

public class BeaconDiscoverer extends Service implements BeaconConsumer {
    private static final String TAG = BeaconDiscoverer.class.getSimpleName();
    private static BeaconManager beaconManager;
    private static Region region;
    private BackgroundPowerSaver backgroundPowerSaver;

    public BeaconDiscoverer() {
    }

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

    @Override
    public void onCreate() {
        region = new Region("myRangingUniqueId", null, null, null);
        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,d:25-25"));

        configureBatterySaverMode();

        beaconManager.bind(this);
    }

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

    private void configureBatterySaverMode() {
        BeaconManager.setAndroidLScanningDisabled(true);
        backgroundPowerSaver = new BackgroundPowerSaver(getApplicationContext());

        // set the duration of the scan to be 5 seconds
        beaconManager.setBackgroundScanPeriod(Utility.convertToMilliseconds(2));
        // set the time between each scan to be 1 min (60 seconds)
        beaconManager.setBackgroundBetweenScanPeriod(Utility.convertToMilliseconds(25));
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "BeaconDiscoverer started up");

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

    @Override
    public void onBeaconServiceConnect() {
        Log.d(TAG, "onBeaconServiceConnect");
        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                    Beacon firstBeacon = beacons.iterator().next();
                    Log.i(TAG, "Beacon detected: " + firstBeacon.getDistance() + " m. - " + firstBeacon.getBluetoothAddress());

                }
            }
        });

        startRanging();
    }

    public void stopRanging() {
        try {
            beaconManager.stopRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    public void startRanging() {
        if (User.currentUser() == null)
            return;

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

應用類別

public class App extends Application {
    private static final String TAG = App.class.getSimpleName();

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

        startService(new Intent(this, BeaconDiscoverer.class));
    }
}

簡單答案:您必須啟用藍牙才能檢測到庫中的信標 信標使用Bluetooth LE通告它們的存在,並且必須打開Bluetooth無線電才能聽到信號。

我無法解釋為什么您在關閉藍牙后仍繼續檢測信標。 一種可能是,您只需在庫消失的短暫掃描周期內從內存緩存中看到它們,然后它們就會消失。 另一種可能是,Android設備在關閉藍牙時說藍牙已關閉,但實際上並沒有關閉。

典型的方法是在啟動應用程序時檢測藍牙是否關閉,並提示用戶將其打開。 參考應用程序中有示例代碼可以在此處執行此操作。

 private void registerBoradcastReceiver() {
    IntentFilter stateChangeFilter = new IntentFilter(
            BluetoothAdapter.ACTION_STATE_CHANGED);
    IntentFilter connectedFilter = new IntentFilter(
            BluetoothDevice.ACTION_ACL_CONNECTED);
//IntentFilter connectedFilter = new   IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
    IntentFilter disConnectedFilter = new IntentFilter(
            BluetoothDevice.ACTION_ACL_DISCONNECTED);
    registerReceiver(stateChangeReceiver, stateChangeFilter);
    registerReceiver(stateChangeReceiver, connectedFilter);
    registerReceiver(stateChangeReceiver, disConnectedFilter);
}

    private BroadcastReceiver stateChangeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED == action) {
            startService;
        }
        if (BluetoothDevice.ACTION_ACL_DISCONNECTED == action) {
            stopService;
        }
        if (BluetoothAdapter.ACTION_STATE_CHANGED == action) {

        }
    }
};

暫無
暫無

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

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