AltBeacon на Android 8 замедляется при первом запуске (приложение не отвечает) - PullRequest
0 голосов
/ 26 февраля 2019

Только при первом запуске приложения (после удаления / установки), после запуска сканирования маяков появляется сообщение «Приложение не отвечает», которое происходит только на Android 8 (Samsung A5 и J5 Prime).Удалил все из приложения, оставив только код для определения маяка, все еще происходит.Не уверен, что это проблема с библиотекой или с тем, как я ее использую.

Вызов BeaconConsumer (context) из моего класса Application.

public class BeaconConsumer implements BootstrapNotifier, org.altbeacon.beacon.BeaconConsumer {
    BeaconManager beaconManager;
    BeaconConsumer(Context applicationContext) {
        beaconManager = BeaconManager.getInstanceForApplication(applicationContext);
        beaconManager.getBeaconParsers().clear();
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=6548,i:4-25,p:1-1"));
        beaconManager.setEnableScheduledScanJobs(false);
        beaconManager.setBackgroundBetweenScanPeriod(15300);
        beaconManager.setBackgroundScanPeriod(1200);
        beaconManager.setForegroundBetweenScanPeriod(10000);
        beaconManager.setForegroundScanPeriod(1200);
        beaconManager.bind(this);           
        beaconManager.setBackgroundMode(false);
        BeaconManager.setDebug(true);
        Region region = new Region("backgroundRegion", null, null, null);
        RegionBootstrap regionBootstrap = new RegionBootstrap(this, region);
    }

    public void onBeaconServiceConnect() {
        beaconManager.removeAllRangeNotifiers();
        beaconManager.addRangeNotifier((beacons, region) -> {
            Log.d("TAG", "didRangeBeaconsInRegion CALLED with size: " + beacons.size() + " on region: " + region);
            Iterator<Beacon> iterator = beacons.iterator();
            while (iterator.hasNext()) {
                Beacon beacon = iterator.next();
                Formatter formatter = new Formatter();
                for (byte b : beacon.getId1().toByteArray()) {
                    formatter.format("%02x", b);
                }
                String payload = formatter.toString();
                Log.d("TAG", "Processing payload: " + payload + " rssi: " + beacon.getRssi());
            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(myRegion);
        } catch (RemoteException e) {
            Log.d("TAG", "Exception starting ranging beacons in region");
        }
    }

    public void didEnterRegion(Region region) {
        try {
            beaconManager.startRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            Log.d("TAG", "Can't start ranging");
        }

        Intent intent = new Intent(mContext, BeaconService.class);
        intent.setAction("com.test.altbeacontest.beaconreference.Service.action.Scan");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mContext.startForegroundService(intent);
        } else {
            mContext.startService(intent);
        }
        mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d("TAG", "ServiceConnection - connected");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d("TAG", "ServiceConnection - disconnected");
            }
        };
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    public void didExitRegion(Region region) {
        Log.d("TAG", "I no longer see a beacon.");
        insideRegion = false;

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

1 Ответ

0 голосов
/ 02 марта 2019

Я подозреваю, что проблема связана с этими операциями, используемыми вместе в одном и том же методе:

beaconManager.bind(this);           
...
RegionBootstrap regionBootstrap = new RegionBootstrap(this, region);

Вы действительно не должны использовать эти два вместе - как правило, вы используете одну или другую (привязка кBeaconManager) или используя RegionBootstrap.Последний объект сам связывается внутри.

Я бы удалил: RegionBootstrap regionBootstrap = new RegionBootstrap(this, region); и вместо этого добавил бы beaconManager.startMonitoringBeaconsInRegion(region); одновременно с вызовом beaconManager.startRangingBeaconsInRegion(myRegion);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...