iBeacon Мониторинг с классом приложения

Я только начал с Java и Android кодирования. Я написал заявку на научное исследование в моем университете. Приложение для местной выставки музея. У меня есть разные локации в моем городе, каждая из которых имеет свою выставку.

Теперь я выполнил задание для каждого местоположения, чтобы пользователь мог увидеть некоторую полезную информацию об образце. Теперь я хочу совместить приложение с iBeacons, я купил 6 маяков у Estimote. Я хочу, чтобы приложение отправляло пользователю уведомление с текстом: "Вы находитесь перед объектом XY. Нажмите, чтобы увидеть больше информации". После нажатия на уведомление пользователь должен открыть конкретное действие, которое я создал. Я также хочу, чтобы приложение осуществляло поиск маяков в фоновом режиме, поэтому, если пользователь приблизится к местоположению, он / она автоматически получит уведомление через несколько секунд.

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

Я уже читал в другой ветке, что я должен держать BeaconManager в классе приложения. Но как мне именно это сделать. Когда я пытаюсь скопировать код, связанный с маяком, в новый класс, с которого я начинаю

public void BeaconMain extends Application{

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

public class MainActivity extends ActionBarActivity
{

    private static final int NOTIFICATION_ID = 123;

    private BeaconManager beaconManager;
    private NotificationManager notificationManager;
    private Region mariendom;
    private Region andreasplatz;
    private boolean entered = false;



    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Beacon beacon = getIntent().getParcelableExtra("extrasBeacon");


        andreasplatz = new Region("andreasplatz",  "B9407F30-F5F8-466E-AFF9-25556B57FE6D", 31134, 3);
        mariendom = new Region("mariendom",  "B9407F30-F5F8-466E-AFF9-25556B57FE6D", 31134, 2);

        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        beaconManager = new BeaconManager(this);



        beaconManager.setBackgroundScanPeriod(500, 1000);

        beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener()
        {
            @Override
            public void onEnteredRegion(Region region, List<Beacon> beacons)
            {

                if(region.getMinor().equals(2)){
                    postNotification("Sie sind am Mariendom");
                    Log.d("Estiomote", "Entered region");
                }

                else if(region.getMinor().equals(3)){
                    postNotification2("Sie sind am Andreasplatz");
                    Log.d("Estiomote", "Entered region");
                }

            }

            @Override
            public void onExitedRegion(Region region)
            {
                /*entered = false;
                postNotification("Sie haben den Mariendom verlassen");
                Log.d("Estiomote", "Exited region");*/
            }

    @Override
    protected void onResume()
    {
        super.onResume();

        notificationManager.cancel(NOTIFICATION_ID);
        beaconManager.connect(new BeaconManager.ServiceReadyCallback()
        {
            @Override
            public void onServiceReady()
            {
                try {
                    Log.d("Estiomote", "Start monitoring");

                    beaconManager.startMonitoring(andreasplatz);
                    beaconManager.startMonitoring(mariendom);

                } catch (RemoteException e)
                {
                    Log.d("Estiomote", "Error while starting monitoring");
                }
            }
        });
    }
    @Override
    protected void onDestroy()
    {
        notificationManager.cancel(NOTIFICATION_ID);
        beaconManager.disconnect();
        super.onDestroy();
    }

    private void postNotification(String msg)
    {
        Intent notifyIntent = new Intent("com.example.walter.him.mariendom");
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(
                MainActivity.this,
                0,
                new Intent[]{notifyIntent},
                PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(MainActivity.this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("HiM - Hildesheim im Mittelalter")
                .setContentText(msg)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        notificationManager.notify(NOTIFICATION_ID, notification);

    }

    private void postNotification2(String msg)
    {
        //Intent notifyIntent = new Intent(MainActivity.this, MainActivity.class);
        Intent notifyIntent = new Intent("com.example.walter.him.andreasplatz");
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(
                MainActivity.this,
                0,
                new Intent[]{notifyIntent},
                PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(MainActivity.this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("HiM - Hildesheim im Mittelalter")
                .setContentText(msg)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(NOTIFICATION_ID, notification);

    }


}

1 ответ

Решение

Я бы посоветовал вам начать с нуля с изучения того, как поместить BeaconManager в класс Application, а не копировать код, который был в Activity в Application, поскольку между этими двумя подходами есть некоторые различия.

Лучше всего начать с учебника, чтобы собрать некоторые фундаментальные понятия и общее понимание:

http://developer.estimote.com/android/tutorial/part-1-setting-up/

И есть также пример уведомления, который вы можете создать через Estimote Cloud:

https://cloud.estimote.com/

Когда вы узнаете, как интегрировать BeaconManager в класс Application, будет довольно просто изменить обратные вызовы onEntered/Exited, чтобы вызывать различные действия в зависимости от того, какой маяк вы указали в диапазоне.

Это порядок, который я бы предложил следовать.


Полное раскрытие: я работаю адвокатом разработчика в Estimote.

Другие вопросы по тегам