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= new 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();
        }
    }
};

}

4

2 に答える 2

1

ここで場所変更コード..これを試してください。

@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; 
    } 

コードごとに必要な場所を変更する必要があります....

于 2012-04-29T05:41:32.597 に答える
1

答えはイエスです。

LocationListener時間または距離の間隔を設定してtoを登録するLocationManagerと、場所が変更されたときに設定と比較して、ユーザーに通知するかどうかを決定できます。

GPS はバッテリーを大量に消費するため、まず Network Location Provider を使用してから、その場所まで遠くないときに GPS を開始することをお勧めします。


コメントが言ったように、最初に移動する必要があります

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

その上

double dis1 = location.distanceTo(tasklocation);

onLocationChanged()(緯度/経度をハードコードするのではなく、これらの場所の設定を移動することをお勧めします。)

これで問題が解決しない場合がありますが、これを行わないと決して機能しません。だから、そのような間違いを残さないでください。


次に、このコードは私にとって(私のエミュレーターで)機能し、「機能しない」可能性がある他の間違いは見当たりません。

権限を確認できます

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

Toastまたは、結果またはLogcat出力を表示する場合があります。

結局のところ、あなたの「機能していない」についての詳細。

于 2012-04-29T05:45:31.980 に答える