Маяк не сканирует, когда приложение закрыто из последних приложений, использующих Alt Beacon Libaray - PullRequest
0 голосов
/ 23 января 2019

Я разрабатываю приложение для сканирования маяков, используя библиотеку altbecaon. Каждый раз, когда я меняю свой сценарий, у меня возникают разные проблемы. Я не знаю, в чем причина. Все работает нормально. Но проблема в том, что когда я закрываю свое приложение от просмотра последних приложений, а затем снова открываю, мое приложение не сканирует. Затем я просто выключил свой маяк, чтобы запустить метод выхода из региона. После этого сканирует как обычно. Я хочу, чтобы приложение сканировало даже после закрытия приложения из недавнего приложения и повторного открытия. Пожалуйста, помогите мне, пожалуйста.

Код фрагмента сканирования:

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d("scannerfragment","oncraeteview");

        view= inflater.inflate(R.layout.fragment_scanning, container, false);

        beaconManager = BeaconManager.getInstanceForApplication(a);

        ArrayList<OfferPromotion>  offersPromotions=new ArrayList<>();
        scanningPageAdapter = new ScanningPageAdapter(a,offersPromotions,ScanningPage.this);


        recycler_scanner.setAdapter(scanningPageAdapter);
        beaconManager.getBeaconParsers().clear();

        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"));


        beaconManager.setForegroundScanPeriod(3001);
        beaconManager.setForegroundBetweenScanPeriod(2001);
        beaconManager.setBackgroundBetweenScanPeriod(2001);
        beaconManager.setBackgroundScanPeriod(3001);
        identifier = Identifier.parse("E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"); //beacon 1

        region = new Region("myMonitoringUniqueId", identifier, null, null);

        Log.w(TAG,"application"+Constantsforbinding.application_stateregion);



        beaconManager.bind(this);

               return view;

    }

@Override
    public Context getApplicationContext() {
        return getActivity().getApplicationContext();
    }

    @Override
    public void unbindService(ServiceConnection serviceConnection) {
        getActivity().unbindService(serviceConnection);
    }

    @Override
    public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) {
        return getActivity().bindService(intent, serviceConnection, i);
    }


    @Override
    public void onBeaconServiceConnect() {

        try{
            beaconManager.updateScanPeriods();
        }
        catch (RemoteException  e){
            e.getLocalizedMessage();
            Toast.makeText(a, ""+e, Toast.LENGTH_SHORT).show();
        }

        addmonitor();
        addrangenotifieer();
        beaconManager.addMonitorNotifier(monitorNotifier);
        beaconManager.addRangeNotifier(rangeNotifier);


    }

     public void addmonitor(){
    monitorNotifier=new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {
            Log.i(TAG, "I just saw an beacon for the first time!");
            startbeaconranging(region);
            nobeacon=0;

        }

        @Override
        public void didExitRegion(final Region region) {
            Log.i(TAG, "No beacons..waiting for 25 seconds to confirm");
            beacondetected=false;
            stopranginbeacon(region);
            if(a!=null){
                Toast.makeText(a, "No beacons..wait for 25 seconds to confirm", Toast.LENGTH_LONG).show();

                a.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {

                                if(beacondetected){
                                    /*Toast.makeText(a, "Beacon detected", Toast.LENGTH_SHORT).show();*/
                                    Log.i(TAG, ""+beacondetected);


                                }
                                else {
                                    try {

                                        lay_no_offer.setVisibility(View.VISIBLE);
                                        ((NavigationActivity)a).setAlreadyScannerlaunched(false);
                                        Log.i(TAG, "no beacons for last 25 seconds"+beacondetected);
                                        Toast.makeText(a, "no beacons for last 25 seconds", Toast.LENGTH_SHORT).show();
                                        tv_status.setText("No beacons detected..scanning");
                                        lay_having_offer.setVisibility(View.GONE);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }

                                }


                            }
                        },25000);

                    }
                });
            }


        }

        @Override
        public void didDetermineStateForRegion(int state, Region region) {
            Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state);
            if(state==1){
                tv_status.setText("Scanning...wait for 15 seconds");

            }else if(state==0){

                tv_status.setText("No beacons..scanning");
            }

        }
    };
}
public void addrangenotifieer(){
    rangeNotifier = new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, final Region region) {
            if (beacons.size() > 0) {

                beacondetected=true;
                Collections.sort((List<Beacon>) beacons, new Comparator<Beacon>()
                {
                    @Override
                    public int compare(Beacon o1, Beacon o2) {
                        return Double.compare(o2.getDistance(),( o1.getDistance()));
                    }


                });

                mac1=((List<Beacon>) beacons).get(0).getBluetoothAddress();
                nobeacon=0;

                if (a != null) {
                    call_offers_api(mac1);

                }
                Log.i(TAG, "The first beacon I see is about "+nobeacon+((List<Beacon>) beacons).get(0).getBluetoothAddress()+"");
            }
            else {



            }
        }
    };
}

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

        stopranginbeacon(region);
        Stopmonitoringbecaon(region);
        beaconManager.removeAllMonitorNotifiers();
        beaconManager.removeAllRangeNotifiers();

        beaconManager.unbind(this);


        Log.d("scannerfragment","ondestroyview");
    }

1 Ответ

0 голосов
/ 23 января 2019

Поймите, что didEnterRegion срабатывает только один раз, когда появляется маяк, соответствующий региону.Библиотека запоминает состояние входа / выхода вашего региона, даже если вы остановите и перезапустите приложение.Таким образом, didEnterRegion не будет запускаться второй раз только потому, что вы перезапускаете свое приложение - маяки должны на самом деле немного выйти за пределы диапазона и вновь появиться, чтобы они сработали во второй раз.

Начало измерения в didEnterRegionможет быть проблематичным из-за вышеизложенного.Вместо этого начните поиск в onBeaconServiceConnect или didDetermineStateForRegion.Оба этих обратных вызова всегда запускаются при перезапуске приложения.

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