2017-02-10 17 views
1

я работаю на простой маяк близости приложения с использованием библиотеки AltBeacon здесь https://altbeacon.github.io/android-beacon-library/samples.htmlAndroid: AltBeacon не обнаруживает маяки

Я экспериментировал с кодом выборки, представленной на вышеуказанном сайте, однако, каждый раз, когда я бегу Применяется только для метода didDetermineStateForRegion(). Если он обнаружит маяк, он перейдет к методу didEnterRegion().

Я не уверен, что я делаю неправильно, и не смог найти ответ в других вопросах.

Существует такая же проблема с эталонным приложением, представленным на указанном веб-сайте, но приложение Locate (на основе AltBeacon) мгновенно обнаруживает мой маяк.

Мой маяк установлен на 152 мс интервала передачи и максимальной мощности передачи.

Это мой код:

MainActivity

public class MainActivity extends AppCompatActivity implements BeaconConsumer { 
    protected final String TAG = "Beacons Monitoring"; 
    private BeaconManager beaconManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24")); 
     beaconManager.bind(this); 
    } 

    public void onDestroy(){ 
     super.onDestroy(); 
     beaconManager.unbind(this); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     beaconManager.addMonitorNotifier(new MonitorNotifier() { 
      @Override 
      public void didEnterRegion(Region region) { 
       Log.e(TAG,"I just saw a beacon for the first time"); 
      } 

      @Override 
      public void didExitRegion(Region region) { 
       Log.e(TAG, "I lost my beacons :("); 
      } 
      @Override 
      public void didDetermineStateForRegion(int i, Region region) { 
       Log.e(TAG, "I just switched from seeing/not seeing a beacon. STATE: " + i); 
      } 
     }); 
     try { 
      beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null)); 

     } catch (RemoteException e){ 
      Log.e(TAG, "EXCEPTION!!! :'("); 
     } 
    } 
} 

Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.michal.beacons2"> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <uses-permission android:name="android.permission.BLUETOOTH"/> 
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Кто-нибудь знает, что может быть неправильно в моем коде?

ответ

1

Мне удалось разобраться в этом.

Во-первых, важно установить макет маяков на тип маяков, которые вы используете. Доступны следующие макеты:

ALTBEACON  m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25 
EDDYSTONE TLM x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15 
EDDYSTONE UID s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19 
EDDYSTONE URL s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v 
IBEACON   m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24 

ИСТОЧНИК: https://beaconlayout.wordpress.com/

Макеты могут быть установлены с помощью следующего кода:

beaconManager.getBeaconParsers().add(new 
BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

Во-вторых, андроид требует разрешения местоположение для обнаружения маяков.Я проверил это, проверив, что происходит с предоставленными и запрещенными разрешениями, но это требование также упоминается на веб-сайте библиотеки Android Beacon. Я рекомендую следующие инструкции по обучению разработчиков Android компании Google относительно получения разрешения пользователя: https://developer.android.com/training/permissions/index.html

Кроме того, я проверил код, предоставленный davidgyoung раз мне удалось разобраться в этом, и это действительно работает так, как описано, так что я хотел бы предложить добавить его на ваш код на этапе разработки.

Все это наглядно объяснено на веб-сайте Android Beacon Library, но я каким-то образом смутил все. Надеюсь, этот ответ поможет кому-то в будущем.

+0

Рад слышать, как вы это поняли! – davidgyoung

0

Поймите, что didEnterRegion обратного вызова срабатывает только тогда, когда вы не уже в регионе. Это означает, что если маяк передавал при перезапуске приложения во время разработки, вы не получите новый обратный вызов. Когда приложение перезагрузится, вы всегда получите новый обратный вызов до didDetermineStateForRegion().

Почему это так? Поскольку Android часто временно убивает приложения из-за условий с низкой памятью, и библиотека автоматически перезапустит их через несколько минут, чтобы продолжать искать маяки. Если библиотека не работает таким образом, приложение будет неоднократно получать обратные вызовы до didEnterRegion каждый раз, когда приложение временно останавливается ОС Android, а затем перезагружается, даже несмотря на то, что маяк никогда не исчезал и снова появлялся.

Это может быть разочарование во время разработки, так что можно отключить эту функцию с помощью следующего кода:

beaconManager.setRegionStatePeristenceEnabled(false)

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

+0

Спасибо за ваш совет. Я только что попробовал добавить beaconManager.setRegionStatePeristenceEnabled (false) сразу после получения экземпляра менеджера Beacon. Однако это не помогло. Я также попытался закрыть приложение, удалив батареи с маяков, запустив приложение и вернув батареи в маяки, и он все еще не работает. Возможно ли, что мой маяк настроен неправильно? В настоящее время у меня включен только iBeacon, но я попытался использовать UID, трансляцию URL и т. Д. С помощью трех разных API (Google, Sensoro и AltBeacon). –

+0

Я также запросил разрешения для FINE LOCATION ACCESS, но маяки все еще не обнаружены. –