2012-04-29 4 views
0

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

Я пробую следующий код, но его не работает.

public class NotifyuserActivity extends Activity {
LocationManager locMan;
double lat;
double lon;
NotificationManager notMan;

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    locMan=(LocationManager) getSystemService(LOCATION_SERVICE); 
    locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,10, mylistener); 
} 

LocationListener mylistener = новый LocationListener() {

@Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
     CharSequence from = "AlarmManager - Time's up!"; 
     CharSequence message = "This is your alert";   
     Location tasklocation=new Location(LocationManager.GPS_PROVIDER); 
     double dis1 = location.distanceTo(tasklocation); 
     tasklocation.setLatitude(22.727733); 
     tasklocation.setLongitude(75.886079); 
     if(dis1 < 200.00) 
     { 

      notMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      Notification n = new Notification(R.drawable.ic_launcher, "Click here for details", System.currentTimeMillis()); 

      Intent notificationIntent = new Intent(NotifyuserActivity.this,NotifyuserActivity.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(NotifyuserActivity.this, 0, notificationIntent, 0); 

     n.setLatestEventInfo(NotifyuserActivity.this, from,message, pendingIntent); 
      notMan.notify(10001, n); 
      Toast.makeText(NotifyuserActivity.this,"Distance to location is: " + dis1, Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 

}

+0

Я не знаком с этим так много, но вы установили запрашиваемое местоположение (например, taskLocation.setLat \ setLong ...) после измерения расстояния. Кроме того, вы только сказали, что он не работает. Что это делает? что работает? –

+0

На самом деле я хочу использовать этот модуль в своем проекте. ya Я пробовал написать tasklocation выше, но он также не работает – shubh

ответ

0

здесь код изменения местонахождения.

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    if (location != null) { 
     System.out.println("in onlocationchanged"); 
     String locationString=location.convert(location.getLatitude(),1); 
     Toast.makeText(this,"locationString=="+locationString, Toast.LENGTH_LONG).show(); 
     double lat = location.getLatitude(); 
     double lng = location.getLongitude(); 
     String currentLocation = "The location is changed to Lat: " + lat + " Lng: " + lng; 
     Toast.makeText(this,currentLocation, Toast.LENGTH_LONG).show(); 
     p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000); 


     // check in database if we have same lattitude & longitude 

     MySQLiteHelper m=new MySQLiteHelper(getBaseContext()); 
     Log.d("Reading: ", "Reading all contacts.."); 
     List<LocWiseProfileBeans> LocWiseProfile= m.getAllLocWiseProfile();  


     for (LocWiseProfileBeans cn : LocWiseProfile) { 
      String log = "Loc Name: "+cn.getLocname()+" ,Lattitude: " + cn.getLattitude()+ " ,Longitude: " + cn.getLongitude()+ " , Selected Profile :"+cn.getSelectedprofile(); 
       // Writing Contacts to log 
      double distance2=00.00; 

     GeoPoint storedLocation=new GeoPoint(
     (int) cn.getLattitude() * 1000000,(int) cn.getLongitude() * 1000000);  

     Location locationB = new Location("point B"); 

     locationB.setLatitude((int) cn.getLattitude() * 1000000); 
     locationB.setLongitude((int) cn.getLongitude() * 1000000); 


     distance2=distFrom(lat,lng,cn.getLattitude(),cn.getLongitude()); 


     if(distance2>1) 
     { 
      Log.d("Name: ", log); 
      Toast.makeText(this, "Loc Name:"+log, Toast.LENGTH_SHORT).show(); 
      Toast.makeText(this,"identical", Toast.LENGTH_LONG).show(); 
      Toast.makeText(this,"distance2======"+distance2, Toast.LENGTH_SHORT).show(); 
sendnotification("Locale Notifications","You visited location " + cn.getLocname()); 


     } 

Этот код служит для уведомления пользователя.

protected void sendnotification (String title, String message) { 
     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 

     int icon = R.drawable.icon; 
     CharSequence tickerText = message; 
     long when = System.currentTimeMillis(); 

     Notification notification = new Notification(icon, tickerText, when); 

     Context context = getApplicationContext(); 
     CharSequence contentTitle = title; 
     CharSequence contentText = message; 
     Intent notificationIntent = new Intent(this, GoogleMapsActivity.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 

     notification.flags = Notification.FLAG_AUTO_CANCEL; 
     notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 
     mNotificationManager.notify(1, notification); 
    } 

Здесь представлена ​​функция преобразования долготы и широты в мили.

public static double distFrom(double lat1, double lng1, double lat2, double lng2) { 
     double earthRadius = 3958.75; 
     double dLat = Math.toRadians(lat2-lat1); 
     double dLng = Math.toRadians(lng2-lng1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
       Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * 
       Math.sin(dLng/2) * Math.sin(dLng/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     double dist = earthRadius * c; 

     return dist; 
    } 

вам необходимо изменить в случае необходимости в соответствии с вашим кодом ....

+0

Я не смог понять ваш код, было бы полезно, если бы вы выяснили ошибку в моем коде ... – shubh

1

Ответ да.

Вы можете зарегистрировать LocationListener до LocationManager с некоторыми настройками интервала времени или расстояния, затем при изменении местоположения можно сравнить его с тем, что вы установили, чтобы решить, следует ли уведомлять пользователя.

GPS потребляет большую мощность аккумулятора, поэтому лучше сначала использовать Network Location Provider, а затем, когда это не так далеко от этого места, запустите GPS.


Как комментарий говорит, вы должны сначала переместить

tasklocation.setLatitude(22.727733); 
tasklocation.setLongitude(75.886079); 

выше

double dis1 = location.distanceTo(tasklocation);

(лучше, вы могли бы переместить эти расположение установки из onLocationChanged() и не жёстко Широта/Долгота.)

Th может не решить вашу проблему, но не делать этого НИКОГДА не будет работать. Поэтому не оставляйте такую ​​ошибку.


Тогда, я должен сказать, этот код работает для меня (в моем эмуляторе), и я не могу увидеть другие ошибки, за то, что вы даете, что может дать вам «не работает».

Вы можете проверить разрешения для

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

Или может показать Toast результат или Logcat выход.

В конце концов, более подробная информация о вашем «не работает».

+0

да, я пробовал, но код не работает. . – shubh

+0

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

+0

Добавьте код 'onLocationChanged()', чтобы показать 'dis1' для каждого изменения местоположения (например, вывод в' TextView'). Покажите результат. –

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