Приложение для сигнализации на основе GPS в Android

#android #gps

#Android #gps

Вопрос:

Я хочу создать приложение, подобное:

  1. Я в городе X
  2. Я хочу получать уведомления (например, о звонке будильника или вибрации и т.д.), Когда я достигаю города Y.

У меня уже есть база данных sqlite, содержащая информацию (широта, долгота) о многих городах.

Я искал Google и SO, но не нашел правильного решения.

Пока что мои исследования говорят об этом:

Что мне нужно сделать, так это создать Service или BroadcastReceiver получить текущее местоположение мобильного телефона с помощью GPS.

Поправьте меня, если я ошибаюсь.

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

Если происходит совпадение, оно должно уведомить пользователя.

То, что я сделал:

  1. Я знаю, как получить текущее местоположение пользователя. (Но не путем создания сервиса. Это то, что я хотел знать! )

  2. Я могу добавлять задачи в базу данных sqlite.

Пожалуйста, подскажите мне, как я могу подойти к этому приложению.

Запускает его, когда пользователь запускает приложение:

  Intent i = new Intent(context, MyLocationApps.class);     
 context.startService(i);
  

 public class MyLocationApps extends Service{

        LocationManager locMan;
        Location curLocation;
        Boolean locationChanged;

        LocationListener gpsListener = new LocationListener() {
        public void onLocationChanged(Location location) {
                // Log.w("GPS", "Started");
                if (curLocation == null) {
                        curLocation = location;
                        locationChanged = true;
                }

                if (curLocation.getLatitude() == location.getLatitude() amp;amp; curLocation.getLongitude() == location.getLongitude())
                        locationChanged = false;
                else
                        locationChanged = true;

                curLocation = location;

                if (locationChanged)
                        locMan.removeUpdates(gpsListener);

        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {
                // Log.w("GPS", "Location changed", null);
        }

        public void onStatusChanged(String provider, int status,
                        Bundle extras) {
                if (status == 0)// UnAvailable
                {

                } else if (status == 1)// Trying to Connect
                {

                } else if (status == 2) {// Available

                }
        }

};


       @Override
       public void onCreate() {
               Toast.makeText(getBaseContext(),"Inside onCreate of Service", Toast.LENGTH_LONG).show();

               Log.e(TAG, "Inside onCreate of Service");
               super.onCreate();

               locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
               locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
               /*if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                       locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
               } else {
                       this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
               }
*/
               if (curLocation != null) {
                       double lat = curLocation.getLatitude();
                       double lng = curLocation.getLongitude();
                       Toast.makeText(getBaseContext(),"Lat : "   String.valueOf(lat)   "n Long : "  String.valueOf(lng), Toast.LENGTH_LONG).show();

               }
               else
               {
                   Toast.makeText(getBaseContext(),"Didn Get any location", Toast.LENGTH_LONG).show();
               }
       }

        final String TAG="LocationService";
        @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
                 Toast.makeText(getBaseContext(),"Inside onStartCommand of Service", Toast.LENGTH_LONG).show();
                 Log.e(TAG, "Inside onStartCommand of Service");



                 return super.onStartCommand(intent, flags, startId);
       }
       @Override
       public void onLowMemory() {
               // TODO Auto-generated method stub
               super.onLowMemory();
       }


          @Override
          public void onStart(Intent i, int startId)
          {
              Toast.makeText(getBaseContext(),"Inside onStart of Service", Toast.LENGTH_LONG).show();
             Log.e(TAG, "Inside onStart of Service");


      }

          public IBinder onBind(Intent arg0) {
                    Log.e(TAG, "Inside onBind of Service");
                     return null;
          }
}
  

Проблема в коде

Когда я запускаю приложение в первый раз, оно отображает всплывающие сообщения. Но оно никогда не отображает всплывающее сообщение, даже если я отправляю местоположение через DDMS..

Где я ошибаюсь, можете ли вы, пожалуйста, сказать мне?

Ответ №1:

Взгляните на код здесь:android-mycycle/MyLocationManager.java

Я реализовал это для своего приложения. Я пытаюсь исправить GPS, прежде чем начну получать местоположение.

Ответ №2:

Наконец-то у меня получилось: (Спасибо Ганапати и Фархану)

 public class MyLocationApps extends Service{

LocationManager locMan;
Location curLocation;
Boolean locationChanged;

Handler handler = new Handler();

LocationListener gpsListener = new LocationListener() {
    public void onLocationChanged(Location location) {
            // Log.w("GPS", "Started");
            if (curLocation == null) {
                    curLocation = location;
                    locationChanged = true;
            }

            if (curLocation.getLatitude() == location.getLatitude() amp;amp; curLocation.getLongitude() == location.getLongitude())
                    locationChanged = false;
            else
                    locationChanged = true;

            curLocation = location;

            if (locationChanged) 
                    locMan.removeUpdates(gpsListener);

    }

    public void onProviderDisabled(String provider) {

    }

    public void onProviderEnabled(String provider) {
            // Log.w("GPS", "Location changed", null);
    }

    public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            if (status == 0)// UnAvailable
            {

            } else if (status == 1)// Trying to Connect
            {

            } else if (status == 2) {// Available

            }
    }

};


   @Override
   public void onCreate() {
           Toast.makeText(getBaseContext(),"Inside onCreate of Service", Toast.LENGTH_LONG).show();

           Log.e(TAG, "Inside onCreate of Service");
           super.onCreate();

           locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
           locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
           /*if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                   locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
           } else {
                   this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
           }
 */
           if (curLocation != null) {
                   double lat = curLocation.getLatitude();
                   double lng = curLocation.getLongitude();
                   Toast.makeText(getBaseContext(),"Lat : "   String.valueOf(lat)   "n Long : "  String.valueOf(lng), Toast.LENGTH_LONG).show();

           }
           else
           {
               Toast.makeText(getBaseContext(),"Didn Get any location", Toast.LENGTH_LONG).show();
           }
   }

    final String TAG="LocationService";
    @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
             Toast.makeText(getBaseContext(),"Inside onStartCommand of Service", Toast.LENGTH_LONG).show();
             Log.e(TAG, "Inside onStartCommand of Service");



             return super.onStartCommand(intent, flags, startId);
   }
   @Override
   public void onLowMemory() {
           // TODO Auto-generated method stub
           super.onLowMemory();
   }


  @Override
  public void onStart(Intent i, int startId)
  {
      Toast.makeText(getBaseContext(),"Inside onStart of Service", Toast.LENGTH_LONG).show();
     Log.e(TAG, "Inside onStart of Service");

     handler.postDelayed(GpsFinder,5000);// will start after 5 seconds
  }

  public IBinder onBind(Intent arg0) {
            Log.e(TAG, "Inside onBind of Service");
             return null;
  }
  public Runnable GpsFinder = new Runnable()
  {

    public void run()
    {
      // TODO Auto-generated method stub

           if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER))
            {

                locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,0, 0, gpsListener);
            }
            else
            {
                    getApplicationContext().startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
            }

            if (curLocation != null) {
                    double lat = curLocation.getLatitude();
                    double lng = curLocation.getLongitude();
                    Toast.makeText(getBaseContext(),"Lat : "   String.valueOf(lat)   "n Long : "  String.valueOf(lng), Toast.LENGTH_LONG).show();

            }

            handler.postDelayed(GpsFinder,5000);// register again to start after 5 seconds...


    }
  };
 }
  

Комментарии:

1. Я подумал, что эта GPS-сигнализация могла бы стать для меня новой идеей для реализации. Но вы внедрили его раньше меня!!! Можем ли мы получить значение GPS для места (когда я держу свой мобильный телефон в этом месте) без подключения к Интернету?

2. ДА. вам нужно будет использовать сетевое местоположение (местоположение вышки сотовой связи).

3. Спасибо. Сталкивались ли вы с каким-либо подобным приложением для сигнализации GPS для Android, готовым к загрузке и бесплатному использованию?

4. ДА. Я разработал такое приложение. Но не поместил его в Google Play.. В Google Play вы найдете множество приложений.

Ответ №3:

Я думаю, вам следует использовать Geofence наряду с intentservice . Обратитесь к официальной документации для получения дополнительной информации.