2014-11-07 2 views
1

У меня есть приложение, которое я использую, чтобы получить некоторые рекламные объявления из конкретного iBeacon. Я делаю это правильно, и bluetooth отлично работает. Проблема в том, что теперь я притворяюсь, что променяю или запускаю что-то, когда пользователь входит в конкретный регион с приложением в фоновом режиме, поэтому я решил использовать AltBeacon lib.Я не могу обнаружить iBeacon в фоновом режиме, используя библиотеку AltBeacon в приложении для Android

я не реализовал услугу, я просто делаю то, что учебник говорит, чтобы начать деятельность, имеющих приложение в фоновом режиме: http://altbeacon.github.io/android-beacon-library/samples.html

Как я вижу в примере (последний), что я сделал установить манифест, как это:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.googlebeacon" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="18" 
     android:targetSdkVersion="18" /> 
    <uses-permission android:name="android.permission.BLUETOOTH"/> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:name="com.example.googlebeacon.MyRegionApp" 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.googlebeacon.MainActivity" 
      android:label="@string/app_name" 
      android:launchMode="singleInstance"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

После того, как я сделал, что я решил создать еще один класс Java, как совет:

package com.example.googlebeacon; 

    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 org.altbeacon.beacon.powersave.BackgroundPowerSaver; 
    import org.altbeacon.beacon.startup.BootstrapNotifier; 
    import org.altbeacon.beacon.startup.RegionBootstrap; 

    import android.app.Application; 
    import android.content.Intent; 
    import android.util.Log; 
    import android.widget.Toast; 

    public class MyRegionApp extends Application implements BootstrapNotifier { 
     private final String DebugTag="HOLAREGION"; 
     private RegionBootstrap regionBootstrap; 
     private BackgroundPowerSaver backgroundPowerSaver; 
     private BeaconManager mBeaconManager; 
     private static final String UUID = "0112234-4556-6778-899a-abbccddeeff0"; 

     @Override 
public void onCreate() { 
    super.onCreate(); 
    Log.d(DebugTag, "App started up"); 
    mBeaconManager = BeaconManager.getInstanceForApplication(this); 
    //BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24")); 
    mBeaconManager.setBackgroundScanPeriod(1100l); 

    mBeaconManager.setBackgroundBetweenScanPeriod(60000l); 

    //Region region = new Region("allbeacons", Identifier.parse(UUID) , null, null); 
    Region region = new Region("allbeacons", null , null, null); 
    //backgroundPowerSaver = new BackgroundPowerSaver(this); 

    regionBootstrap = new RegionBootstrap(this, region); 
    BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24")); 
} 



     @Override 
     public void didDetermineStateForRegion(int arg0, Region arg1) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void didEnterRegion(Region arg0) { 
      // TODO Auto-generated method stub 


      Log.d(DebugTag, "Got a didEnterRegion call"); 

      regionBootstrap.disable(); 

      Toast.makeText(getApplicationContext(), "ENTRA EN LA REGION!!!", 
         Toast.LENGTH_LONG).show(); 

      Intent intent = new Intent(this, MainActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      this.startActivity(intent); 

     } 

     @Override 
     public void didExitRegion(Region arg0) { 
      // TODO Auto-generated method stub 
      Log.d(DebugTag, "Got a didExitRegion call"); 
     } 




    } 

И если я использую:

// set the duration of the scan to be 1.1 seconds 
      //mBeaconManager.setBackgroundScanPeriod(1100l); 
     // set the time between each scan to be 1 minute (60 seconds) 
      //mBeaconManager.setBackgroundBetweenScanPeriod(60000l); 

аварии приложений и не показывает MainActivity у меня есть, он пытается, но закрыт в мгновении.

Ошибка LogCat: FIXED ADDING mBeaconManager = BeaconManager.getInstanceForApplication (this);

11-07 14:17:22.791: W/System.err(2125): java.lang.RuntimeException: Unable to create application com.example.googlebeacon.MyRegionApp: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.setBackgroundScanPeriod(long)' on a null object reference 
11-07 14:17:22.791: W/System.err(2125):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4433) 
11-07 14:17:22.791: W/System.err(2125):  at android.app.ActivityThread.access$1500(ActivityThread.java:142) 
11-07 14:17:22.791: W/System.err(2125):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1263) 
11-07 14:17:22.791: W/System.err(2125):  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-07 14:17:22.791: W/System.err(2125):  at android.os.Looper.loop(Looper.java:136) 
11-07 14:17:22.791: W/System.err(2125):  at android.app.ActivityThread.main(ActivityThread.java:5118) 
11-07 14:17:22.791: W/System.err(2125):  at java.lang.reflect.Method.invoke(Native Method) 
11-07 14:17:22.791: W/System.err(2125):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
11-07 14:17:22.791: W/System.err(2125):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 
11-07 14:17:22.791: W/System.err(2125): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.setBackgroundScanPeriod(long)' on a null object reference 
11-07 14:17:22.791: W/System.err(2125):  at com.example.googlebeacon.MyRegionApp.onCreate(MyRegionApp.java:31) 
11-07 14:17:22.791: W/System.err(2125):  at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007) 
11-07 14:17:22.791: W/System.err(2125):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4430) 
11-07 14:17:22.791: W/System.err(2125):  ... 8 more 

Я добавил к моему project.properties следующую строку и она по-прежнему не работает:

manifestmerger.enabled=true 

Добавление этой последней строки, я смог обнаружить IBeacon как я запустить приложение но теперь в фоновом режиме, хотя я установил setBackground ScanPeriod и BetweenScanPeriod в 1100l и 60000l, чтобы увеличить частоту сканирования, но я не могу ничего увидеть в Background.

Используя пример приложения, представленный в качестве примера, я могу без проблем обнаружить свой iBeacon (скачанный здесь https://github.com/AltBeacon/android-beacon-library-reference).

Любая помощь будет очень признательна. Я очень новичок в программировании на Android, пожалуйста, будьте немного терпеливы, я делаю все возможное.

С уважением.

Иван

+0

Может вы получаете трассировку стека из аварии с помощью LogCat? – davidgyoung

+0

Я изменил метод onCreate, и теперь приложение не сбой, возможно, неправильный порядок. Теперь я вижу журнал «Приложение запущено», но он никогда не входит в метод didEnterRegion, поэтому я не могу выполнять никаких действий. Нужно ли мне что-то делать, чтобы обнаружить iBeacon? – Fulgor3

+0

Извините, он все еще падает, я загружаю неправильную версию приложения. Я помещал исключение в основное окно вопросов. – Fulgor3

ответ

1

Если вы используете Eclipse, убедитесь в том, что вы правильно включен манифест слияния в соответствии с инструкциями здесь: http://altbeacon.github.io/android-beacon-library/configure.html

Редактировать файл project.properties и добавьте строку: manifestmerger.enabled=true

+0

Я сделал это, но он все еще не обнаруживает мой iBeacon. Я должен сказать, что с примером, приведенным в https://github.com/AltBeacon/android-beacon-library-reference, я могу обнаружить свое устройство без проблем на переднем плане, поэтому я использую правильный проприетарный формат. Есть ли проблема с использованием библиотек bluetooth android и библиотек AltBeacon? Может быть, класс, который я использую для фона, не знает, как получить доступ к bluetooth? Но он должен работать сам по себе, не так ли? С уважением. – Fulgor3

+0

Это работает !!!! Я очистил проект и, по крайней мере, вступил в метод didEnterRegion !!! Так что теперь я собираюсь продолжать тестирование. Большое спасибо davidgyoung !!! Конечно, я пропустил эту линию! Но, похоже, он не сканирует очень 1100l, как я установил setBackgroundScanPeriod. Что может случиться? С уважением – Fulgor3

+0

Наконец, установка scanperior и betweenscanperiods раз. Я получаю некоторый результат, но это были не очень конюшни. Еще раз спасибо, и теперь я проверю потребление батареи. С уважением – Fulgor3

2

Поймите, что Android Beacon Library 2.0 разработан, чтобы быть свободным от интеллектуальной собственности, поэтому он может быть с открытым исходным кодом. Это означает, что он не будет обнаруживать запатентованные маяки из коробки и только обнаруживает маяки, соответствующие AltBeacon standard..

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

// IMPORTANT: replace the string in setBeaconLayout() with one that describes the format 
// of your proprietary beacon 
beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 

Как комментарий упоминает выше, вам нужно будет найти строку для вашего патентованного типа маяка. Чтобы узнать, как это сделали другие, попробуйте выполнить поиск Google для «setBeaconLayout» (включая кавычки) и найдите выражение макета маяка для типа маяка, который у вас есть.

+0

Hi davidgyoung. Это правда, поэтому я добавил эту строку с самого начала. Я использую в MainActivity обычные bluetooth-библиотеки, чтобы получить необработанные данные объявления BLE, является ли это мб причиной того, что я не получаю никакого результата, используя этот класс отдельно ?. В MainActivity я не ссылаюсь на libs, объекты или методы AltBeacon, и я не реализую никакой службы. Должно быть, я пропустил какой-то момент, потому что еще ничего не могу обнаружить. – Fulgor3

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

  • Нет связанных вопросов^_^