2016-06-02 4 views
1

Я построил небольшое приложение, которое использует Android Beacon библиотеку, чтобы найти близлежащие маяки, когда пользователь запускает приложение после этого урока: http://www.software7.com/blog/creating-a-beacon-app-for-android-in-less-than-10-minutes-from-scratch/Запуск и остановка сканера App Beacon с Android Beacon библиотеки

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

Я начинаю и закрытия Beacon менеджер в моих OnCreate и OnDestroy методов, управляет процессом поиска.

Приложение работает красиво, когда я его начинаю первый раз. Но когда я закрою его кнопкой со стрелкой назад по телефону и откройте его снова, будет больше сообщений консоли или обновлений на текстовой метке. Это также происходит, когда экран переходит в режим сна, и я должен разблокировать его снова - никаких обновлений консоли, нет обновлений пользовательского интерфейса.

По консольным сообщениям, OnBeaconServiceConnect работает над возобновлением приложения, но я не получаю сообщение журнала от didEnterRegion ни setRangeNotifier снова.

Я также попытался установить привязку и отсоединить в OnPause и OnResume, что тоже не сработало.

Как я могу возобновить поиск & найти процесс снова правильно? Спасибо за любую помощь :)

Вот мой комментарий кода в случае, если вы хотите иметь короткий взгляд:

package de.mediatoni.beacontut01; 

import android.graphics.Region; 
import android.os.RemoteException; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

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.MonitorNotifier; 
import org.altbeacon.beacon.RangeNotifier; 

import java.util.Collection; 


public class BeaconActivity extends ActionBarActivity implements BeaconConsumer{ 

    public static final String TAG = "BeaconsEverywhere"; 
    // Beacon Manager Variable 
    private BeaconManager beaconManager; 

    //GUI Text Label 
    TextView rangeElement; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_beacon); 

     // Vars for XML Elements 
     rangeElement = (TextView) findViewById(R.id.range); 

     // Instantiate a Beacon Manager via factory method 
     beaconManager = BeaconManager.getInstanceForApplication(this); 

     // Tell Library how to decode the signal 
     beaconManager.getBeaconParsers().add(new BeaconParser() 
       .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 
     // Start the Beacon Manager 
     beaconManager.bind(this); 
    } 

    // When the Beacon Service starts, search for Beacons with the following Identifier 
    @Override 
    public void onBeaconServiceConnect() { 
     final org.altbeacon.beacon.Region region = new org.altbeacon.beacon.Region("myBeacons", Identifier.parse("73676723-7400-0000-ffff-0000ffff0005"), null, null); 
     beaconManager.setMonitorNotifier(new MonitorNotifier() { 
      // If the phone enters a Beacon region 
      @Override 
      public void didEnterRegion(org.altbeacon.beacon.Region region) { 
       try { 
        Log.d(TAG, "did Enter Region"); 
        beaconManager.startRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      // If the phone leaves a Beacon region 
      @Override 
      public void didExitRegion(org.altbeacon.beacon.Region region) { 
       try { 
        Log.d(TAG, "did Exit Region"); 
        beaconManager.stopRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void didDetermineStateForRegion(int i, org.altbeacon.beacon.Region region) { 

      } 
     }); 

     // If the phone finds a Beacon fitting the rules, print it in the console 
     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      //Log out welche beacons in der Nähe sind 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, org.altbeacon.beacon.Region region) { 
       for(final Beacon oneBeacon : beacons) { 
        Log.d(TAG, "distance: " + oneBeacon.getDistance() + "id: " + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3()); 

        // Access UI thread and make changes to the UI 
        // Placing rangeElement.setText outside of the Runnable will crash the App 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          // Change the text label in the UI 
          rangeElement.setText(String.valueOf(oneBeacon.getDistance())); 
         } 
        }); 
       } 
      } 
     }); 

     try { 
      beaconManager.startMonitoringBeaconsInRegion(region); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    // When the App gets closed, stop the Beacon Manager 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     beaconManager.unbind(this); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_beacon, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

ответ

1

Проблема скорее всего в том, что вы не получите второе событие входа, когда активность перезагружается , потому что маяк все еще виден и никогда не выходил из поля зрения. Начиная с версии библиотеки 2.8, повторные события ввода подавляются, если не имеется соответствующего события выхода.

Для того, чтобы каждый раз, когда вы начинаете мониторинг, регистрируете событие входа, просто прекратите контролировать регион, прежде чем снова заново его контролировать. Например:

beaconManager.stopMonitoringBeaconsInRegion(region); 
beaconManager.startMonitoringBeaconsInRegion(region);    
+0

Удивительный, это сработало для меня - отлично и спасибо! – olop01

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