信标在Android的服务未检出信标、检出、Android

2023-09-07 00:37:58 作者:该活出自己要的姿态╮

我使用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() 
被罚50亿后,Google不再强制绑定Android默认引擎

添加到部分 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

 
精彩推荐
图片推荐