Android - Proximity Alert не срабатывает - PullRequest
0 голосов
/ 12 мая 2011

Я прочитал несколько тем, блогов и форумов, но не нашел решения

Я хочу оповещение о приближении так:

public class ProximityIntentReceiver extends BroadcastReceiver {        
@Override
        public void onReceive(Context  context, Intent intent) {
            String key= LocationManager.KEY_PROXIMITY_ENTERING;

            Boolean entering=intent.getBooleanExtra(key, false);
            Log.i(QUEST_PROXIMITY_ALERT,"entering");
            Log.i(QUEST_PROXIMITY_ALERT,"exiting");

        }       
    }  

В onCreateMethod:

 locationmanager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
 provider=locationmanager.getBestProvider(criteria, true);
 location=locationmanager.getLastKnownLocation(provider);
 if (location!=null) updateWithNewLocation(location);     
 locationmanager.requestLocationUpdates(provider, 0, 0, locationlistener);

А мой слушатель местоположения:

private final LocationListener locationlistener= new LocationListener() {
        public void onLocationChanged(Location location) {
            Log.i("LOCATION_UPDATED","");
            updateWithNewLocation(location);
            mapview.invalidate();
    }
        public void onProviderDisabled(String provider) {
            //Message TO-DO
        }

        public void onProviderEnabled(String provider) { }

        public void onStatusChanged(String provider, int sttus, Bundle extras) { }
    };

В начале упражнения я показываю пользователю диалоговое окно для выбора некоторых данных:

//Dialog to choose available EduQuests
       AlertDialog.Builder builder = new AlertDialog.Builder(this);
       builder.setTitle("Selecciona una búsqueda");
       builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int item) {
               dialog.dismiss();
               mCurrent=item;
               Double lat=Double.parseDouble(mQuests.getItem(item).getPlace(0).getLatitude());
               Double longi=Double.parseDouble(mQuests.getItem(item).getPlace(0).getLongitude());
               GeoPoint point=new GeoPoint((int)(longi*1E6),(int) (lat*1E6));
               SetProximityAlert(point);
               mCurrentPlace=0; //First GeoPoint in the quest
               mQuests.getItem(mCurrent).getPlace(0).setVisibility(true);
               DrawPoints();
               mapview.invalidate();
           }
       });
      AlertDialog alert = builder.create();
      alert.show();   

А в ClickListener диалога, как вы, я вызываю SetProximityAlert (point):

 private void SetProximityAlert(GeoPoint point) {    
        double lat=point.getLatitudeE6();
        double lng=point.getLongitudeE6();
        Log.i("SETTING PROXIMITY ALERT LATTITUDE--->",Double.toString(lat));
        Log.i("SETTING PROXIMITY ALERT LONGITUDE--->",Double.toString(lng));
        float radio= 20; //In meters    
        long expiration=-1;

        //Creo el Intent con la acción que hemos definido"
        Intent intent= new Intent(QUEST_PROXIMITY_ALERT);

        //Creo el PendingIntent pasándole
        PendingIntent proximityIntent=PendingIntent.getBroadcast(this,0, intent, 0);
        locationmanager.addProximityAlert(lat, lng, radio, expiration, proximityIntent);

        //Promixity Alert
        IntentFilter filter= new IntentFilter(QUEST_PROXIMITY_ALERT);
        registerReceiver(new ProximityIntentReceiver(),filter);      
    }

Я вычисляю расстояние, чтобы проверить, должно ли срабатывать предупреждение в методе UpdateWithNewLocation (), который работает нормально:

private void updateWithNewLocation(Location location) {
          Double lat=Double.parseDouble(mQuests.getItem(mCurrent).getPlace(mCurrentPlace).getLatitude());
          Double longi=Double.parseDouble(mQuests.getItem(mCurrent).getPlace(mCurrentPlace).getLongitude());
          Location distlocation=new Location(provider);
          distlocation.setLatitude(lat);
          distlocation.setLongitude(longi);       
          Log.i("DISTANCE TO CURRENT POINT--->",Float.toString(location.distanceTo(distlocation))+"...metros");
          curlat=location.getLatitude();
          curlong=location.getLongitude();
          GeoPoint point=new GeoPoint((int)(curlat*1E6),(int) (curlong*1E6));
          OverlayItem overlayitem=new OverlayItem(point,"I'm here","This is my current position");
          if (curpositemizedoverlay==null) {
              curpositemizedoverlay=new QuestItemizedOverlay(this.getResources().getDrawable(R.drawable.me)); 
          }
          else {
              curpositemizedoverlay.removeItem(curpositemizedoverlay.size()-1);
          }           
          curpositemizedoverlay.addOverlay(overlayitem);
          mapOverlays.add(curpositemizedoverlay);
          mapview.invalidate();
    }

А private static String QUEST_PROXIMITY_ALERT="com.pekechis.ieda.proximityalert";

Пакет с именем com.pekechis.ieda и основным видом деятельности IEDAQUEST.

Я вижу, как меняются текущие изменения положения и положения устройства в DDMS. Также изменяет расстояние до точки интереса (точки интереса), которое я указал в журнале.

Но предупреждение не срабатывает.

Любая идея о том, что я делаю неправильно.

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

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 июня 2011

Если вы все еще ищете, для меня это сработало: http://www.gauntface.co.uk/pages/blog/2010/01/04/proximity-alerts-in-android/

0 голосов
/ 19 мая 2011

хорошо, после многих попыток я не смог уволить оповещение о близости. Я выбрал и альтернативные решения (я полагаю, не оптимальные)

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

...