应用程序类

时间:2015-11-07 18:11:37

标签: background monitoring ibeacon estimote

我刚开始使用Java和Android编码。我在我的大学写了一份科学研究申请书。该应用程序是为博物馆的本地展览。我镇上有不同的地点,每个地点都有自己的展览。

现在我为每个位置制作了一个活动,因此用户可以看到该示例的一些有用信息。现在我想将应用程序与iBeacons结合使用,我从Estimote购买了6个信标。我希望应用程序向用户发送一些通知,其中包含以下文字:“您在对象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 个答案:

答案 0 :(得分:0)

我建议您从头开始学习如何将BeaconManager放入Application类,而不是将Activity中的代码复制粘贴到应用程序中,因为这两种方法之间存在一些差异。 / p>

最好的地方是从教程开始,收集一些基本概念和一般理解:

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

此外,您还可以通过Estimote Cloud生成通知示例:

https://cloud.estimote.com/#/apps/add/notification

一旦你学会了如何将BeaconManager集成到Application类中,修改onEntered / Exited回调以根据你输入范围的信标产生不同的活动应该非常简单。

这是我建议遵循的顺序。

完全披露:我在Estimote担任开发人员代言人。