我使用Altbeacon库(稳定版2.1.4)来检测信标。如果我在活动中做到这一点,我没有问题检测它们。不过,我不能得到这个从服务工作。下面是我得到了什么:
包com.ibeacontest.android;进口java.util.Collection中;进口org.altbeacon.beacon.Beacon;进口org.altbeacon.beacon.BeaconConsumer;进口org.altbeacon.beacon.BeaconManager;进口org.altbeacon.beacon.BeaconParser;进口org.altbeacon.beacon.Identifier;进口org.altbeacon.beacon.RangeNotifier;进口org.altbeacon.beacon.Region;进口android.app.Service;进口android.content.Intent;进口android.os.IBinder;进口android.os.RemoteException;进口android.util.Log;公共类TestBestzBeaconService扩展服务实现BeaconConsumer{ 私人BeaconManager beaconManager; 私人最终字符串BEACON_UUID =11687109-915f-4136-a1f8-e60ff514f96d 私人最终诠释BEACON_MAJOR = 3; @覆盖 公共无效的onCreate(){ super.onCreate(); L.P(以TestBestzBeaconService的onCreate()); } @覆盖 公众的IBinder onBind(意向意图){ 返回null; } @覆盖 公众诠释onStartCommand(意向意图,诠释标志诠释startId){ L.P(在TestBestzBeaconService onStartCommand()); beaconManager = BeaconManager.getInstanceForApplication(本); beaconManager.bind(本); // iBeacons? BeaconParser BP0 =新BeaconParser(); bp0.setBeaconLayout(M:2-3 = 0215,I:4-19,I:20-21,I:22-23页:24-24); 。beaconManager.getBeaconParsers()加(BP0); // Bluecats? BeaconParser BP1 =新BeaconParser(); bp1.setBeaconLayout(M:2-3 = 0201,I:28-29页:24-24); 。beaconManager.getBeaconParsers()加(BP1); 返回super.onStartCommand(意向,旗帜,startId); } @覆盖 公共无效的onDestroy(){ L.P(以TestBestzBeaconService的onDestroy()); beaconManager.unbind(本); } @覆盖 公共无效onBeaconServiceConnect(){ L.P(以TestBestzBeaconService onBeaconServiceConnect()); beaconManager.setRangeNotifier(新RangeNotifier(){ @覆盖 公共无效didRangeBeaconsInRegion(收集和LT;烽火台>为arg0,ARG1区){ L.P(以TestBestzBeaconService - 匿名didRangeBeaconsInRegion()); } }); 地区区域=新区域(myregion,Identifier.parse(BEACON_UUID),Identifier.fromInt(BEACON_MAJOR),NULL); // 尝试{ beaconManager.startRangingBeaconsInRegion(区); }赶上(RemoteException的E){ L.P(在TestBestzBeaconService onBeaconServiceConnect(),RemoteException的!); } } 私有静态L级 { 公共静态无效的P(String s)将{ Log.i(信标,S); } }}
我从活动中调用该如此:
公共类MainActivity延伸活动{ @覆盖 保护无效的onCreate(捆绑savedInstanceState){ super.onCreate(savedInstanceState); 的setContentView(R.layout.activity_main); startService(新意图(这一点,TestBestzBeaconService.class)); }}
日志输出我得到的是:
9月三日日至19日:56:40.233:I /灯塔(25210):在TestBestzBeaconService的onCreate()9月3日至19日:56:40.233:I /灯塔(25210):在TestBestzBeaconService onStartCommand()9月3日至19日:56:40.566:I /灯塔(25210):在TestBestzBeaconService onBeaconServiceConnect()
添加到部分 AndroidManifest
:
<! - 集所需的AltBeacon SDK - ><使用许可权的android:NAME =android.permission.BLUETOOTH/><使用许可权的android:NAME =android.permission.BLUETOOTH_ADMIN/>
和应用程序内
标签:
<! - 集所需的AltBeacon SDK - ><服务机器人:名字=org.altbeacon.beacon.service.BeaconService/><服务机器人:名字=com.ibeacontest.android.TestBestzBeaconService/>
...但没有信标或 didRangeBeaconsInRegion
日志输出的迹象。任何指针?
据我所知监控
仅在工作在后台测距
没有。尝试首先启动监控
,然后立即当你输入监控
启动测距
。
是这样的:
//设置监控mBeaconManager.setMonitorNotifier(新MonitorNotifier(){ @覆盖 公共无效didEnterRegion(地区区域){ Log.d(TEST,输入的航标区); //开始Raning只要你发现一盏明灯 尝试{ mBeaconManager.startRangingBeaconsInRegion(mRegion); }赶上(RemoteException的E){ e.printStackTrace(); } }});//设置测距mBeaconManager.setRangeNotifier(新RangeNotifier(){ @覆盖 公共无效didRangeBeaconsInRegion(最终收集和LT;烽火台>标,地区区){ 如果(beacons.size()大于0){ Log.i(TAG,P(在TestBestzBeaconService - 匿名 } }});尝试{ //开始监测 mBeaconManager.startMonitoringBeaconsInRegion(mRegion);}赶上(RemoteException的E){ e.printStackTrace();}
不要忘了添加航标服务
到清单
:
<服务 机器人:名字=org.altbeacon.beacon.service.BeaconService 机器人:启用=真 机器人:出口=真 机器人:isolatedProcess =假 机器人:标签=灯塔>< /服务> <服务 机器人:名字=org.altbeacon.beacon.BeaconIntentProcessor 机器人:启用=真正的>< /服务>
注意:在此期间也检查的lib项目
I'm using the Altbeacon library (stable release 2.1.4) to detect beacons. If I do it in an Activity, I have no problems detecting them. However I can't get this to work from a service. Here's what I've got:
package com.ibeacontest.android;
import java.util.Collection;
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 android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class TestBestzBeaconService extends Service implements BeaconConsumer
{
private BeaconManager beaconManager;
private final String BEACON_UUID = "11687109-915f-4136-a1f8-e60ff514f96d";
private final int BEACON_MAJOR = 3;
@Override
public void onCreate() {
super.onCreate();
L.p("In TestBestzBeaconService onCreate()");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand (Intent intent, int flags, int startId) {
L.p("in TestBestzBeaconService onStartCommand()");
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
//iBeacons ?
BeaconParser bp0 = new BeaconParser();
bp0.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
beaconManager.getBeaconParsers().add(bp0);
//Bluecats?
BeaconParser bp1 = new BeaconParser();
bp1.setBeaconLayout("m:2-3=0201,i:28-29,p:24-24");
beaconManager.getBeaconParsers().add(bp1);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
L.p("In TestBestzBeaconService onDestroy()");
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
L.p("In TestBestzBeaconService onBeaconServiceConnect()");
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> arg0, Region arg1) {
L.p("In TestBestzBeaconService - anonymous didRangeBeaconsInRegion()");
}
});
Region region = new Region("myregion", Identifier.parse(BEACON_UUID), Identifier.fromInt(BEACON_MAJOR), null); //
try {
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
L.p("In TestBestzBeaconService onBeaconServiceConnect(), REMOTEEXCEPTION!");
}
}
private static class L
{
public static void p(String s) {
Log.i("beacon", s);
}
}
}
I'm calling this from an Activity as so:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, TestBestzBeaconService.class));
}
}
The log output I'm getting is:
03-19 09:56:40.233: I/beacon(25210): In TestBestzBeaconService onCreate()
03-19 09:56:40.233: I/beacon(25210): in TestBestzBeaconService onStartCommand()
03-19 09:56:40.566: I/beacon(25210): In TestBestzBeaconService onBeaconServiceConnect()
Parts added to the AndroidManifest
:
<!-- Needed for AltBeacon SDK -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
and inside the Application
tag:
<!-- Needed for AltBeacon SDK -->
<service android:name="org.altbeacon.beacon.service.BeaconService"/>
<service android:name="com.ibeacontest.android.TestBestzBeaconService" />
...but no signs of beacons or the didRangeBeaconsInRegion
log output. Any pointers?
As i know Monitoring
only works in background while Ranging
do not. Try firstly starting a Monitoring
and then immediately when you enter Monitoring
start Ranging
.
Something like:
//Set Monitoring
mBeaconManager.setMonitorNotifier(new
MonitorNotifier() {
@Override
public void didEnterRegion (Region region){
Log.d("TEST", "ENTERED beacon region");
//Start Raning as soon as you detect a beacon
try {
mBeaconManager.startRangingBeaconsInRegion(mRegion);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
//Set Ranging
mBeaconManager.setRangeNotifier(new
RangeNotifier() {
@Override
public void didRangeBeaconsInRegion ( final Collection<Beacon> beacons, Region region){
if (beacons.size() > 0) {
Log.i(TAG, p("In TestBestzBeaconService - anonymous
}
}
});
try
{
//Start Monitoring
mBeaconManager.startMonitoringBeaconsInRegion(mRegion);
}
catch(RemoteException e)
{
e.printStackTrace();
}
Don't forget to add beacon service
to Manifest
:
<service
android:name="org.altbeacon.beacon.service.BeaconService"
android:enabled="true"
android:exported="true"
android:isolatedProcess="false"
android:label="beacon"></service>
<service
android:name="org.altbeacon.beacon.BeaconIntentProcessor"
android:enabled="true"></service>
note: In meantime check also lib project