Не удалось обнаружить мои маяки в фоновом режиме в Android

У меня есть 2 радиомаяка Rad из сети Radius. Я настроил их на Eddystone с помощью приложения Locate. Теперь я написал небольшую программу для отправки уведомлений в фоновом режиме, т.е. когда приложение не запущено. Мне нужно отправлять уведомления, когда приложение находится в фоновом режиме. Для этого я использую библиотеку маяков Android. Я пробовал почти все ссылки, но я не могу его обнаружить.

Я вставляю свой код здесь

public class BeaconReferenceApplication extends Application implements BootstrapNotifier, RangeNotifier {
    private static final String TAG = "BeaconReferenceApp";
    private RegionBootstrap regionBootstrap;
    private BackgroundPowerSaver backgroundPowerSaver;
    private boolean haveDetectedBeaconsSinceBoot = false;
    private MonitoringActivity monitoringActivity = null;    

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

        BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);

        beaconManager.getBeaconParsers().clear();
        beaconManager.getBeaconParsers().add(new BeaconParser().
           setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
        beaconManager.setBackgroundBetweenScanPeriod(1000);

        Log.i(TAG, "setting up background monitoring for beacons and power saving");

        //Toast.makeText(getApplicationContext(), "Called!!!" , Toast.LENGTH_LONG).show();

        // wake up the app when a beacon is seen
        Region region = new Region("backgroundRegion", null, null, null);

        regionBootstrap = new RegionBootstrap(this, region);

        // simply constructing this class and holding a reference to it in your custom Application
        // class will automatically cause the BeaconLibrary to save battery whenever the application
        // is not visible.  This reduces bluetooth power usage by about 60%
        //backgroundPowerSaver = new BackgroundPowerSaver(this);

        // If you wish to test beacon detection in the Android Emulator, you can use code like this:
        // BeaconManager.setBeaconSimulator(new TimedBeaconSimulator() );
        // ((TimedBeaconSimulator) BeaconManager.getBeaconSimulator()).createTimedSimulatedBeacons();
    }

    @Override
    public void didEnterRegion(Region arg0) {
        // In this example, this class sends a notification to the user whenever a Beacon
        // matching a Region (defined above) are first seen.
        Log.i(TAG, "did enter region.");

        //sendNotification();

        if (!haveDetectedBeaconsSinceBoot) {
            Log.i(TAG, "auto launching MainActivity");

            // The very first time since boot that we detect an beacon, we launch the
            // MainActivity
            Intent intent = new Intent(this, MonitoringActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            // Important:  make sure to add android:launchMode="singleInstance" in the manifest
            // to keep multiple copies of this activity from getting created if the user has
            // already manually launched the app.
            this.startActivity(intent);
            haveDetectedBeaconsSinceBoot = true;
        } else {
            if (monitoringActivity != null) {
                // If the Monitoring Activity is visible, we log info about the beacons we have
                // seen on its display
                monitoringActivity.logToDisplay("I see a beacon again" );
            } else {
                // If we have already seen beacons before, but the monitoring activity is not in
                // the foreground, we send a notification to the user on subsequent detections.
                Log.i(TAG, "Sending notification.");
                //sendNotification();
            }
        }    
    }

    @Override
    public void didExitRegion(Region region) {
        if (monitoringActivity != null) {
            monitoringActivity.logToDisplay("I no longer see a beacon.");
        }
    }

    @Override
    public void didDetermineStateForRegion(int state, Region region) {
        if (monitoringActivity != null) {
            monitoringActivity.logToDisplay("I have just switched from seeing/not seeing beacons: " + state);
        }
    }

    private void sendNotification() {
        NotificationCompat.Builder builder =
                new NotificationCompat.Builder(this)
                        .setContentTitle("Beacon Reference Application")
                        .setContentText("An beacon is nearby in application.")
                        .setSmallIcon(R.drawable.ic_launcher);

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntent(new Intent(this, MonitoringActivity.class));
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

        builder.setContentIntent(resultPendingIntent);
        NotificationManager notificationManager =
                (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, builder.build());
    }

    public void setMonitoringActivity(MonitoringActivity activity) {
        Log.i("Log", "TEST ONLY");

        this.monitoringActivity = activity;
    }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> arg0, Region arg1) {
        // TODO Auto-generated method stub

        sendNotification();

        //Log.i("Log", "TEST ONLY");
    }

person Sangie    schedule 30.11.2015    source источник
comment
Людям легче помочь вам, если у них есть соответствующий фрагмент кода, над которым нужно работать. Пожалуйста, покажите нам, что вы уже пробовали.   -  person Bö macht Blau    schedule 30.11.2015
comment
Я обновил свой код. Пожалуйста, дайте мне знать, если что-нибудь можно сделать.   -  person Sangie    schedule 02.12.2015
comment
У меня нет опыта работы с маяками (пока), извините. Но я вижу, что вы используете NotificationCompat.Builder с одной стороны и NotificationManager (не NotificationManagerCompat) с другой. Это работает?   -  person Bö macht Blau    schedule 02.12.2015


Ответы (2)


Судя по макету, который вы используете, я могу сказать, что вы сканируете AltBeacon, а не Eddystone. Таким образом, вы должны изменить (или добавить) макет маяка следующим образом:

s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19

or

beaconManager.getBeaconParsers().add(BeaconParser.EDDYSTONE_UID_LAYOUT);

Кроме того, вы можете проверить следующие ссылки для получения дополнительной информации об использовании библиотеки AltBeacon для маяков Eddystone;

Кстати, вы можете настроить приложение Locate. для обнаружения только маяков Eddystone, чтобы вы могли сузить проблему и увидеть, не работает ли ваш код или ваш маяк.

person Furkan Varol    schedule 02.12.2015
comment
Нет.. Все так же. Меня не уведомляют в фоновом режиме. - person Sangie; 05.12.2015
comment
Согласно вашему коду, если вы можете обнаруживать маяки, когда приложение находится на переднем плане, вы также должны обнаруживать их в фоновом режиме. Ваш код выглядит нормально. Однако файлы манифеста могут вызывать эту ошибку. Можешь поделиться? - person Furkan Varol; 07.12.2015

У меня такая же проблема. Потратьте больше одного дня на ее решение. С кодом проблем нет.

(Просто сделал глупую ошибку, как разработчик).

Кому-то это пригодится..

На моем тестовом устройстве я не включил службы определения местоположения, поэтому не могу получать маяки в фоновом режиме. Поэтому включите службы определения местоположения, чтобы получать уведомления маяка в фоновом режиме, с другой стороны передний план не требует этих настроек.

Спасибо..

person abdul sathar    schedule 15.08.2017