0

Я использую библиотеку Altbeacon (стабильная версия 2.1.4) для обнаружения маяков. Если я делаю это в Activity, у меня нет проблем с их обнаружением. Однако я не могу заставить это работать из службы. Вот что я получил:Маяки, которые не обнаружены в сервисе Android

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

} 

Я звоню это из деятельности, как так:

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 журнала. Любые указатели?

+0

Можете ли вы показать код «Manifest» и какую версию «AltBeacon» вы используете? – hrskrs

+0

@hrskrs Обновлено. Я использую стабильную версию 2.1.4 – Sandy

+0

, но попробуйте мой ответ и скажите, есть ли улучшения – hrskrs

ответ

0

Как я знаю Monitoring работает только в фоновом режиме, а Ranging - нет. Попробуйте сначала начать Monitoring, а затем сразу же после ввода Monitoring начните Ranging.

Что-то вроде:

//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

+0

На самом деле, если я запустил его из Activity, он отлично работает без контроля. В любом случае я дам ваше предложение. – Sandy

+0

Просто попробовал это и все равно не сработает. – Sandy

+1

@ Сэнди, так почему этот ответ принят ??? –

0

Опубликованный код находится в проекте библиотеки и содержит правильные вставки в файле AndroidManifest, однако в фактическом проекте приложения этого не было.

Я считаю, что обычно это может привести к сбою приложения, но в этом случае он просто не будет отображать маяки.

Добавление этого заставило его работать.

+0

Рад, что вы это решили! – davidgyoung

+0

@ Sandy в моем ответе я сказал, что вы также не забудьте включить эти строки в «Manifest», в любом случае рад, что вы его решили :) – hrskrs

+0

Можете ли вы отредактировать, чтобы добавить примечание для проверки проекта lib? – Sandy

Смежные вопросы