簡體   English   中英

如何使用Altbeacon:Android信標庫在后台對信標進行定位?

[英]How to range beacons in background using Altbeacon: Android Beacon Library?

我正在開發一個提供后台信標監視的應用程序。 當用戶從定義的區域輸入信標時,我想開始測距。 當應用程序處於后台並且一直在監視並且用戶進入我定義的區域時,我想開始進行范圍測量並獲取InstanceID或Major,Minor值來確定那是什么信標,然后連接到服務器並向用戶發送通知。 最好的辦法是,我可以在后台與服務器進行通訊並與之通信。 我使用此示例來實現后台監視: https : //altbeacon.github.io/android-beacon-library/samples.html 我還從此處下載了示例項目: https : //github.com/AltBeacon/android-beacon-library-reference以此為基礎。

不幸的是,在此示例中,當用戶進入區域時,啟動了活動……我不希望這種情況發生。 所以我的問題是:是否可以在后台對信標進行測距?

當我將應用程序放入后台方法“ didRangeBeaconsInRegion(Collection beacons,Region region)”仍然從MainActivity中調用時,在我的情況下,也發生了奇怪的事情,但是沒有找到信標。 由於beaconManager處於后台模式,因此也很少調用method。 當我啟動示例項目時,這沒有發生。 也許是因為我沒有MonitoringActivity。 我的MainActivity在啟動時會立即執行。 當然,我嘗試設置與示例BeaconReferenceApplication中完全相同的所有內容。

順便說一句,我正在使用Android 6.0.1在Nexus 5上測試我的應用

預先感謝您提供任何解決方案!

我終於弄清楚了該怎么做! 其實我很簡單,我從一開始就做對了,但是由於一個錯誤,我一直在使用舊版本的Altbeacon庫,這導致了我所有的問題……恩

沒關系。 這是我的代碼。 Meybe可以使用它;)我通過創建集中的Application類來實現它,該類在輸入定義的Region時實現了BootstrapNotifier的后台通知。 我的課程還實現了BeaconConsumer,RangeNotifier接口,這是進行信標范圍調整所必需的。

package com.smartmachi.smartmachi_android;
import android.app.Application;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.Identifier;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
import org.altbeacon.beacon.startup.BootstrapNotifier;
import org.altbeacon.beacon.startup.RegionBootstrap;

import java.util.Collection;

public class BeaconReferenceApplication extends Application implements BootstrapNotifier, BeaconConsumer, RangeNotifier {
    private static final String TAG = "BeaconReferenceApp";
    private RegionBootstrap regionBootstrap;
    private BackgroundPowerSaver backgroundPowerSaver;
    private MainActivity rangingActivity = null;
    BeaconManager beaconManager;


    public void onCreate() {
        super.onCreate();
        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"));

        Region region = new Region("backgroundRegion", Identifier.parse("0xf7826da6bc5b71e0893e"), null, null);
        regionBootstrap = new RegionBootstrap(this, region);

        backgroundPowerSaver = new BackgroundPowerSaver(this);

        beaconManager.setBackgroundBetweenScanPeriod(30000l);
        beaconManager.setForegroundBetweenScanPeriod(2000l);
        beaconManager.bind(this);
    }

    @Override
    public void didEnterRegion(Region region) {
        Log.d(TAG, "did enter region.");
        try {
            beaconManager.startRangingBeaconsInRegion(region);
        }
        catch (RemoteException e) {
            if (BuildConfig.DEBUG) Log.d(TAG, "Can't start ranging");
        }
    }

    @Override
    public void didExitRegion(Region region) {
        try {
            beaconManager.stopRangingBeaconsInRegion(region);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void didDetermineStateForRegion(int state, Region region) {
        Log.d(TAG,"I have just switched from seeing/not seeing beacons: " + state);
    }

    private void sendNotification(String text) {
        NotificationCompat.Builder builder =
                new NotificationCompat.Builder(this)
                        .setContentTitle("Beacon Reference Application")
                        .setContentText(text)
                        .setSmallIcon(R.drawable.ic_launcher);

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntent(new Intent(this, MainActivity.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());
    }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        if (beacons.size() > 0) {
            for (Beacon b : beacons) {
                if(b.getId2().toString().equals("0x6d767674636e")) {
                    Log.e(TAG, "Beacon with my Instance ID found!");
                    sendNotification("Beacon with my Instance ID found!");
                }
            }
        }
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.setRangeNotifier(this);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM