2011-09-03 2 views
2

Я хотел бы знать, возможно ли его получить местоположение пользователя без использования LocationListener.Android: Местоположение пользователя без locationListener

Причина, по которой я спрашиваю, что мои события locationListener не вызываются.

public class LocationActivity extends Activity implements LocationListener{ 

    private LocationManager m_locationManager; 

    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     LinearLayout content = new LinearLayout(this); 
     content.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     content.setOrientation(LinearLayout.VERTICAL); 
     content.setBackgroundColor(Color.TRANSPARENT); 

     TextView infoLabel = new TextView(this); 
     infoLabel.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
     infoLabel.setTextSize(20.0f); 
     infoLabel.setText("Initializing..."); 
     content.addView(infoLabel); 

     try{ 
      m_locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

      String provider = null; 

      if (m_locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
       provider = LocationManager.GPS_PROVIDER ; 
       Log.d("Unity", "Using GPS"); 
       m_locationManager.requestLocationUpdates(provider, 0, 0, this); 
      } else if(m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
       provider = LocationManager.NETWORK_PROVIDER; 
       Log.d("Unity", "Using Netword"); 
       m_locationManager.requestLocationUpdates(provider, 0, 0, this); 
      } else { 
       Log.d("Unity", "Provider Not available"); 
      } 

     }catch(Exception ex){ 
      Log.d("Unity", "locatons error " + ex.getMessage()); 
     } 

     setContentView(content); 

    } 

    public void onLocationChanged(Location location) { 
     Log.d("Unity", "UserLocation Lat:" + location.getLatitude() + " Long:" + location.getLongitude()); 
    } 
    public void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Unity", "onStatusChanged");} 
    public void onProviderEnabled(String provider) {Log.d("Unity", "onProviderEnabled");} 
    public void onProviderDisabled(String provider) {Log.d("Unity", "onProviderDisabled");} 
} 

Посмотреть этот пост для получения дополнительной информации:

Android: Can't create handler inside thread that has not called Looper.prepare()

Modified, чтобы отразить mmeyer комментарии

ответ

1

Во-первых, вы можете проверить последнее известное местоположение при выборе поставщика с LocationManager.getLastKnownLocation(provider) и посмотреть если он не является нулевым и не слишком старым.

Кроме того, ваш код выглядит адекватным. Я подозреваю, что проблема может заключаться в том, что третий параметр в вашем запросе requestLocationUpdates говорит только отправлять обновления, если местоположение изменилось более чем на 100 метров. Для большинства ситуаций, когда вы работаете в отладке и наблюдаете logcat, перемещение сотен метров в секунду кажется маловероятным.

Из API документов:

Частоты уведомления может контролироваться с помощью minTime и параметров minDistance. Если minTime больше 0, LocationManager может потенциально отдыхать за миллисекунды минут между обновлениями местоположения для экономии энергии. Если minDistance больше чем 0, то место будет передано, только если устройство перемещается на minDistance meters. Для получения уведомления как можно чаще, установить оба параметра 0.

+0

Так getLastKnownLocation не равно нулю, но до сих пор нет обновлений. Знаете ли вы, что я могу получить текущую позицию без использования функции locationListener? Или это единственный способ получить его? – user346443

+0

Нет, я не думаю, что есть другой способ. getLastKnownLocation просто дает вам быстрый способ получить местоположение, прежде чем вы получите какое-либо обновление, поэтому пользовательский интерфейс/пользователь не должен ждать. Но я все еще думаю, что причина, по которой вы не получаете обновления, состоит в том, что ваши параметры запрашивают обновления только тогда, когда местоположение изменилось более чем на 100 метров. Что произойдет, если вы измените третий параметр на 0? – mmeyer

+0

Изменение обоих параметров на 0 ничего не делает, и getLastKnownLocation более 24 часов. Я называю это от движка Unity Game. Таким образом, очевидно, что он каким-то образом заворачивает события. Представление открыто правильно, только эти события не стреляют. Спасибо за вашу помощь в этом. – user346443