2014-09-23 2 views
3

После запуска активности GPS включен и захватывает широту, долготу пользователя и сообщает об этом для разбора в качестве Geopoint. Проблема в том, что GPS постоянно работает в фоновом режиме и постоянно отчитывается о местонахождении Parse. Я бы хотел, чтобы GPS только однажды захватил информацию о местоположении, а затем сразу же остановился, так как сам я заметил, что в течение дня я получил около 20 тыс. Запросов с парсером, и я думаю, что он работает постоянно в фоновом режиме.Работа с GPS-адресом

Ниже приведен код вида деятельности:

public class MoodActivity extends Activity { 

    private FeedbackDialog feedBack; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_mood); 
     feedBack = new FeedbackDialog(this, ""); 
     LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      LocationListener mlocListener = new MyLocationListener(); 

      mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 







     final TextView teating = (TextView) this.findViewById(R.id.tdinning); 
     teating.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CasualEventsActivity.class)); 
      } 
     }); 

     final ImageView ieating = (ImageView) this.findViewById(R.id.idinning); 
     ieating.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CasualEventsActivity.class)); 
      } 
     }); 

     final TextView tdrinks = (TextView) this.findViewById(R.id.tcasual); 
     tdrinks.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CasualEventsActivity.class)); 
      } 
     }); 

     final ImageView idrinks = (ImageView) this.findViewById(R.id.icasual); 
     idrinks.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CasualEventsActivity.class)); 
      } 
     }); 

     final TextView tshows = (TextView) this.findViewById(R.id.tshows); 
     tshows.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, EntertainmentEventsActivity.class)); 
      } 
     }); 

     final ImageView ishows = (ImageView) this.findViewById(R.id.ishows); 
     ishows.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, EntertainmentEventsActivity.class)); 
      } 
     }); 

     final TextView tarts = (TextView) this.findViewById(R.id.tculture); 
     tarts.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CultureEventsActivity.class)); 
      } 
     }); 

     final ImageView iarts = (ImageView) this.findViewById(R.id.iculture); 
     iarts.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CultureEventsActivity.class)); 
      } 
     }); 

     final Button viewall = (Button) this.findViewById(R.id.brandom); 
     viewall.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MoodActivity.this.startActivity(new Intent(MoodActivity.this, CasualEventsActivity.class)); 
      } 
     }); 
    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main_activity_actions, menu); 
     getActionBar().setDisplayShowTitleEnabled(false); 



     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle presses on the action bar items 
     switch (item.getItemId()) { 
      case R.id.pageExperience: 
       openPageExperience(); 
       return true; 
      case R.id.pageMessaging: 
       openPageMessage(); 
       return true; 

      case R.id.pageEventsBooking: 
       openPageBook(); 
       return true; 

      case R.id.pageProfile: 
       openPageProfile(); 
       return true; 

      case R.id.pageReport: 
       openPageReport(); 
       return true; 

      case R.id.pageAbout: 
       openPageAbout(); 
       return true; 

      case R.id.pageLogout: 
       openPageLogout(); 
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    private void openPageLogout() { 
     // TODO Auto-generated method stub 
     //Now call logout 
     ParseUser.logOut(); 
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
     startActivity(intent); 
    } 



    private void openPageAbout() { 
     // TODO Auto-generated method stub 

    } 

    private void openPageReport() { 
     // TODO Auto-generated method stub 
     FeedbackSettings feedbackSettings = new FeedbackSettings(); 

     //SUBMIT-CANCEL BUTTONS 
     feedbackSettings.setCancelButtonText("No"); 
     feedbackSettings.setSendButtonText("Send"); 

     //DIALOG TEXT 
     feedbackSettings.setText("Hey, would you like to give us some feedback so that we can improve your experience?"); 
     feedbackSettings.setYourComments("Type your question here..."); 
     feedbackSettings.setTitle("Feedback Dialog Title"); 

     //TOAST MESSAGE 
     feedbackSettings.setToast("Thank you so much!"); 
     feedbackSettings.setToastDuration(Toast.LENGTH_SHORT); // Default 
     feedbackSettings.setToastDuration(Toast.LENGTH_LONG); 

     //RADIO BUTTONS 
     feedbackSettings.setRadioButtons(false); // Disables radio buttons 
     feedbackSettings.setBugLabel("Bug"); 
     feedbackSettings.setIdeaLabel("Idea"); 
     feedbackSettings.setQuestionLabel("Question"); 

     //RADIO BUTTONS ORIENTATION AND GRAVITY 
     feedbackSettings.setOrientation(LinearLayout.HORIZONTAL); // Default 
     feedbackSettings.setOrientation(LinearLayout.VERTICAL); 
     feedbackSettings.setGravity(Gravity.RIGHT); // Default 
     feedbackSettings.setGravity(Gravity.LEFT); 
     feedbackSettings.setGravity(Gravity.CENTER); 

     //SET DIALOG MODAL 
     feedbackSettings.setModal(true); //Default is false 

     //DEVELOPER REPLIES 
     feedbackSettings.setReplyTitle("Message from the Developer"); 
     feedbackSettings.setReplyCloseButtonText("Close"); 
     feedbackSettings.setReplyRateButtonText("RATE!"); 

     //DEVELOPER CUSTOM MESSAGE (NOT SEEN BY THE END USER) 
     feedbackSettings.setDeveloperMessage("This is a custom message that will only be seen by the developer!"); 
     feedBack.show(); 
    } 

    private void openPageProfile() { 
     // TODO Auto-generated method stub 
     Intent intent = new Intent(this, profileDetailsActivity.class); 
     startActivity(intent); 

    } 

    private void openPageBook() { 
     // TODO Auto-generated method stub 

    } 

    private void openPageMessage() { 
     // TODO Auto-generated method stub 

    } 

    private void openPageExperience() { 
     // TODO Auto-generated method stub 
     Intent intent = new Intent(this, MoodActivity.class); 
     startActivity(intent); 
    } 

    public class MyLocationListener implements LocationListener { 

     @Override 
     public void onLocationChanged(Location loc) { 
      // TODO Auto-generated method stub 
      double lati = loc.getLatitude(); 
      double longi = loc.getLongitude(); 

      ParseUser currentUser = ParseUser.getCurrentUser(); 
      currentUser.saveInBackground(); 

      ParseGeoPoint point = new ParseGeoPoint(lati, longi); 
      currentUser.put("location", point); 

      currentUser.saveInBackground(new SaveCallback() { 
       @Override 
       public void done(ParseException e) { 
        setProgressBarIndeterminateVisibility(false); 

        if (e == null) { 
         // Success! 

        } else { 

        } 
       } 
      }); 

     } 

      @Override 
      public void onProviderDisabled(String provider) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT).show(); 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show(); 


      } 

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

      } 
      } 
} 

Если вам нужны какие-либо разъяснения, дайте мне знать. Спасибо заранее.

Обновление Я пробовал работать с одним обновлением вместо этого, но он, похоже, не работает.

Под OnCreate

LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
      LocationListener mlocListener = new MyLocationListener(); 


      mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, Looper.myLooper()); 

и

public class MyLocationListener implements LocationListener { 

     @Override 
     public void onLocationChanged(Location loc) { 
      // TODO Auto-generated method stub 
      double lati = loc.getLatitude(); 
      double longi = loc.getLongitude(); 

      ParseUser currentUser = ParseUser.getCurrentUser(); 
      currentUser.saveInBackground(); 

      ParseGeoPoint point = new ParseGeoPoint(lati, longi); 
      currentUser.put("location", point); 

      currentUser.saveInBackground(new SaveCallback() { 
       @Override 
       public void done(ParseException e) { 
        setProgressBarIndeterminateVisibility(false); 

        if (e == null) { 
         // Success! 

        } else { 

        } 
       } 
      }); 

     } 

      @Override 
      public void onProviderDisabled(String provider) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT).show(); 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show(); 


      } 

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

      } 
      } 
} 

ответ

1

При вызове LocationManager.requestLocationUpdates(), система будет непрерывно предоставлять обновления местоположения через LocationListener, приведенный в этом вызове.

Если вы заинтересованы в получении только один обновление местоположения, у вас есть два варианта:

  1. Использование LocationManager.requestSingleUpdate()
  2. Использование LocationManager.requestLocationUpdates(), но отменить обновления после первого обновления ,

Я пойду вперед с 2, так как у вас уже есть некоторые code.You нужно сначала объявить переменную mLocManager быть полем класса, а не объявлять его локально в OnCreate(). Затем вам нужно добавить следующий код в свой LocationListener.

public class MyLocationListener implements LocationListener { 

     @Override 
     public void onLocationChanged(Location loc) { 

      double lati = loc.getLatitude(); 
      double longi = loc.getLongitude(); 

      mlocManager.remoteUpdates(this); // ADD THIS STATEMENT 

      // The rest of your code goes here ... 

     } 

    } 
+0

Благодарим вас за быстрый ответ и разъяснение. Из любопытства, как будет работать первый вариант? – John

+0

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

+1

@ user3907211: Трудно сказать, что может быть проблемой с requestSingleUpdate(). Для вас работает requestLocationUpdates()? Вы уверены, что у вас есть соединение GPS/WiFi? – stackoverflowuser2010

2

вы должны найти путь к removeupdates как

mlocManager.removeUpdates(mlocListener); 

после отправки синтаксического анализа информации

+0

Спасибо за ваш ответ. Я могу обойти этот код. Добавлю ли я его в файл mlocManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, mlocListener); under onCreate? – John

+1

Нет, что бы я делал, это то, что моя активность реализует LocationListener и делает PublicManager общедоступным на уровне класса, а затем просто выполняет работу в одном классе и ставит removeupdates в onLocationChanged сразу после вашей работы синтаксического анализа – JRowan

+0

Привет, проблема, которую я замечаю с removeUpdates - это то, что он только захватывает местоположение один раз, что так или иначе, как я этого хотел.Я имел в виду, что каждый раз, когда кто-то запускает приложение, он записывает свое новое местоположение один раз и позволяет обновлять местоположение каждые 30 минут (потому что позволяет говорить, что человек никогда не закрывает приложение и находится в поездке), так как он постоянно против. – John

1

Кроме что сказал @JRowan, Вы также можете использовать:

String provider = LocationManager.getBestProvider(new Criteria(), true); 
Location myLocation = LocationManager.getLastKnowLocation(provider); 

Если ваше время место не должно быть точным, то есть, если вы можете позволить себе данные о местоположении, несколько старых.

Method link

+0

Спасибо за ваш быстрый ответ. Наряду с добавлением предложенной строки Мне нужно удалить любые строки? – John

+0

, чтобы использовать этот код, вам действительно ничего не нужно менять. Вместо того, чтобы получать местоположение в 'onLocationReceived', вы просто используете' myLocation'. Для ответа @ JRowan вам нужно вызвать 'removeUpdates' после того, как вы закончите получать информацию, и все будет сохранено безопасно. – nem035

+0

Привет, одна проблема, которую я замечаю с помощью removeUpdates, заключается в том, что она только захватывает местоположение один раз, что так или иначе, как я этого хотел. Я имел в виду, что каждый раз, когда кто-то запускает приложение, он записывает свое новое местоположение один раз и позволяет обновлять местоположение каждые 30 минут (потому что позволяет говорить, что человек никогда не закрывает приложение и находится в поездке), так как он постоянно против. – John