如何使用Altbeacon:Android信标库在后台定位信标?

如何使用Altbeacon:Android信标库在后台定位信标?,android,background,altbeacon,region-ranging,Android,Background,Altbeacon,Region Ranging,我正在开发一个应用程序,提供后台信标监控。我想在用户从定义的区域进入信标时开始测距。当应用程序在后台,并且它一直在监控,用户进入我定义的区域时,我想开始测距并获取InstanceID或主、次值,以确定那个是什么信标,连接到服务器并向用户发送通知。最好是我能在后台与服务器进行测距和通信。我使用此示例实现后台监控:。我还从这里下载了示例项目:基于它 不幸的是,在本例中,当用户输入区域时,活动启动。。。我不想那样。Soo我的问题是:有可能在背景中对信标进行测距吗 在我的案例Bean中也发生了奇怪的事情

我正在开发一个应用程序,提供后台信标监控。我想在用户从定义的区域进入信标时开始测距。当应用程序在后台,并且它一直在监控,用户进入我定义的区域时,我想开始测距并获取InstanceID或主、次值,以确定那个是什么信标,连接到服务器并向用户发送通知。最好是我能在后台与服务器进行测距和通信。我使用此示例实现后台监控:。我还从这里下载了示例项目:基于它

不幸的是,在本例中,当用户输入区域时,活动启动。。。我不想那样。Soo我的问题是:有可能在背景中对信标进行测距吗

在我的案例Bean中也发生了奇怪的事情,因为当我将我的应用程序放在后台时,仍然从MainActivity调用方法“DidRangeBeaconsisnRegion(收集信标,区域区域)”,但找不到信标。由于beaconManager处于后台模式,因此调用方法的频率也较低。当我启动示例项目时,这并没有发生。也许是因为我没有监控功能。我的主要活动在启动时不会立即进行。当然,我试图将所有内容设置为与BeaconReferenceApplication示例中完全相同的内容

顺便说一句,我正在用安卓6.0.1在Nexus5上测试我的应用程序


提前感谢您提供的任何解决方案

我终于想出了办法!事实上,我很简单,我从一开始就在做,但由于一个错误,我一直在使用旧版本的Altbeacon库,这导致了我所有的问题。。。嗯

没关系。这是我的密码。也许有人可以用它;) 我通过创建集中式应用程序类实现了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);
    }
}
package com.smartmachi.smartmachi_android;
导入android.app.Application;
导入android.app.NotificationManager;
导入android.app.pendingent;
导入android.app.TaskStackBuilder;
导入android.content.Context;
导入android.content.Intent;
导入android.os.RemoteException;
导入android.support.v4.app.NotificationCompat;
导入android.util.Log;
导入org.altbeacon.beacon.beacon;
导入org.altbeacon.beacon.Beaconsumer;
导入org.altbeacon.beacon.BeaconManager;
导入org.altbeacon.beacon.BeaconParser;
导入org.altbeacon.beacon.Identifier;
导入org.altbeacon.beacon.RangeNotifier;
导入org.altbeacon.beacon.Region;
导入org.altbeacon.beacon.powersave.BackgroundPowerSaver;
导入org.altbeacon.beacon.startup.BootstrapNotifier;
导入org.altbeacon.beacon.startup.RegionBootstrap;
导入java.util.Collection;
公共类BeaconReferenceApplicationExtends应用程序实现BootstrapNotifier、BeaconConsumer、RangeNotifier{
私有静态最终字符串TAG=“BeaconReferenceApp”;
私有区域引导区域引导;
私人BackgroundPowerSaver BackgroundPowerSaver;
private MainActivity rangingActivity=null;
BeaconManager BeaconManager;
public void onCreate(){
super.onCreate();
beaconManager=beaconManager.getInstanceForApplication(此应用程序);
beaconManager.getBeaconParsers().add(新的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=新的regionBootstrap(此,区域);
backgroundPowerSaver=新的backgroundPowerSaver(此);
信标管理器。扫描周期(30000l)之间的退避地;
信标管理器。在扫描周期(2000l)之间设置foreground;
beaconManager.bind(这个);
}
@凌驾
公共区域(区域){
Log.d(标签“did enter region.”);
试一试{
StarTrangBeaconRegion(地区)信标管理人;
}
捕获(远程异常){
if(BuildConfig.DEBUG)Log.d(标记“无法开始测距”);
}
}
@凌驾
公共区域(区域){
试一试{
站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长站长;
}捕获(远程异常){
e、 printStackTrace();
}
}
@凌驾
公共无效不确定地区(国际州、地区){
Log.d(标记“我刚刚从看到/没有看到信标切换到:+状态);
}
私有无效发送通知(字符串文本){
NotificationCompat.Builder=
新建NotificationCompat.Builder(此)
.setContentTitle(“信标参考应用程序”)
.setContentText(文本)
.setSmallIcon(R.drawable.ic_发射器);
TaskStackBuilder stackBuilder=TaskStackBuilder.create(此);
stackBuilder.addNextIntent(新意图(this,MainActivity.class));
悬而未决的结果悬而未决的结果=
stackBuilder.getpendingent(
0,
PendingEvent.FLAG_更新_当前
);
builder.setContentIntent(resultPendingContent);
通知经理通知经理=
(NotificationManager)this.getSystemService(Context.NOTIFICATION\u服务);
notificationManager.notify(1,builder.build());
}
@凌驾
公共无效范围信标区域(收集信标,区域){
如果(beacons.size()>0){
用于(信标b:信标){
如果(b.getId2().toString().equals(“0x6d767674636e”)){
Log.e(标记“找到具有我的实例ID的信标!”);
sendNotification(“找到具有我的实例ID的信标!”);
}
}
}
}
@凌驾
聚氨基甲酸酯