0

Altbeacon ライブラリ (安定版リリース 2.1.4) を使用してビーコンを検出しています。アクティビティでそれを行うと、それらを問​​題なく検出できます。ただし、これをサービスから機能させることはできません。これが私が持っているものです:

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);
        }
    }

}

私はこれをActivityから呼び出しています:

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));
    }

}

私が得ているログ出力は次のとおりです。

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()

に追加されたパーツAndroidManifest:

<!-- Needed for AltBeacon SDK -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

Applicationタグ内:

<!-- Needed for AltBeacon SDK -->
<service android:name="org.altbeacon.beacon.service.BeaconService"/>
<service android:name="com.ibeacontest.android.TestBestzBeaconService" />

...しかし、ビーコンやdidRangeBeaconsInRegionログ出力の兆候はありません。ポインタはありますか?

4

2 に答える 2

0

私が知ってMonitoringいるように、バックグラウンドでのみ動作しますが、動作しRangingません。最初に a を起動してから、startMonitoringを入力したらすぐに起動してみてください。MonitoringRanging

何かのようなもの:

  //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();
}

beacon serviceに追加することを忘れないでください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>

注:それまでの間、こちらもチェックしてくださいlib project

于 2015-03-19T15:30:53.290 に答える
0

投稿されたコードはライブラリ プロジェクトにあり、AndroidManifestファイルに正しい挿入が含まれていましたが、実際のアプリ プロジェクトにはこれがありませんでした。

通常、これによりアプリがクラッシュすると思いますが、この場合はビーコンが表示されません。

これを追加すると機能しました。

于 2015-03-19T18:45:03.467 に答える