2015-03-19 2 views
1

Я использую следующий код, чтобы получить пользователи Откуда:Android расположение петли

public class MainActivity extends ActionBarActivity { 
 
    //=========================================== On Create ======================================== 
 
    @ 
 
    Override protected void onCreate(Bundle savedInstanceState) { 
 
    super.onCreate(savedInstanceState); 
 
    setContentView(R.layout.activity_main); 
 
    //======================================= Location ========================================= 
 
    LocationManager mlocManager = 
 
     (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
 
    LocationListener mlocListener = new MyLocationListener(); 
 
    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
 
    } 
 
}

public class MyLocationListener implements LocationListener {@ 
 
    Override 
 
    public void onLocationChanged(Location loc) { 
 
    loc.getLatitude(); 
 
    loc.getLongitude(); 
 
    String Text = "My current location is: " + 
 
     "Latitude = " + loc.getLatitude() + 
 
     "Longitude = " + loc.getLongitude(); 
 
    Toast.makeText(getApplicationContext(), 
 
     Text, 
 
     Toast.LENGTH_SHORT).show(); 
 
    }@ 
 
    Override 
 
    public void onProviderDisabled(String provider) { 
 
    Toast.makeText(getApplicationContext(), 
 
     "Gps Disabled", 
 
     Toast.LENGTH_SHORT).show(); 
 
    }@ 
 
    Override 
 
    public void onProviderEnabled(String provider) { 
 
    Toast.makeText(getApplicationContext(), 
 
     "Gps Enabled", 
 
     Toast.LENGTH_SHORT).show(); 
 
    }@ 
 
    Override 
 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
 
}

Когда я запустить приложение, оно переходит в бесконечный цикл отображения местоположения пользователя. Как я могу показать это местоположение только один раз одним нажатием кнопки?

ответ

2

Отредактированный код ниже, чтобы использовать либо GPS или сетевого расположения.

использовать Также эти разрешения:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

Вот очень простой случай, ПИ с только Button и TextView.

MainActivity.java:

public class MainActivity extends ActionBarActivity { 

Button button; 
TextView locText; 
double lat; 
double lon; 
Location loc; 
LocationManager mlocManager; 
String provider; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = (Button)findViewById(R.id.buttonGo); 

    locText = (TextView)findViewById(R.id.textView); 

    mlocManager = 
      (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    //LocationListener mlocListener = new MyLocationListener(); 
    //mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 

    Criteria criteria = new Criteria(); 
    //criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); //Try this instead 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 

    provider = mlocManager.getBestProvider(criteria, true); 

    if (provider != null) { 
     loc = mlocManager.getLastKnownLocation(provider); 

     lat = loc.getLatitude(); 
     lon = loc.getLongitude(); 
    } 

    locText.setText(lat + " " + lon); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (provider != null) { 
       loc = mlocManager.getLastKnownLocation(provider); 

       lat = loc.getLatitude(); 
       lon = loc.getLongitude(); 
      } 

      locText.setText(lat + " " + lon); 
     } 
    }); 
} 

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

     <Button 
      android:id="@+id/buttonGo" 
      android:layout_weight="1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Refresh Location"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/textView" 
      android:layout_below="@+id/buttonGo" 
      android:layout_marginTop="86dp" /> 

</RelativeLayout> 
+0

На самом деле я использую AsyncTask: D, потому что я Макин g приложение погоды, которое ожидает загрузки данных и отображает текущую погоду. Я обрезал код выше и добавил в свой PreExecute с помощью Async, поэтому я предполагаю, что каждый раз, когда Async называется, он получит местоположение. Однако он не работал, как я ожидал. Если я запустил приложение с отключенным местоположением, он установит lon и lat как 0,0. Как это исправить? –

+0

Невозможно получить местоположение от GPS с отключенным режимом местоположения. Вы можете использовать 'getLastKnownLocation()' в связи с регистрацией слушателя. Просто не забудьте использовать разумные значения при регистрации вашего слушателя, чтобы вы не постоянно использовали GPS-радио. Кроме того, вы можете использовать сетевое расположение, если GPS недоступен, в котором используется меньше батареи. –

+0

Если я запрашиваю обновление местоположения, тогда мне нужно использовать регистр другого класса. В моем случае выше это было 'LocationListener mlocListener = new MyLocationListener();' Есть ли обходной путь к нему? –

0

Полный учебник по этой ссылке: TUTORIAL

1) реализует View.OnClickListener:

public class MainActivity extends ActionBarActivity implements View.OnClickListener{ 

2) добавить метод OnClick:

public void onClick(View v) { 

    switch (rootView.getId()) { 
     case R.id."nameofthebutton": 
      findMyLocation(); 
      break; 
    } 
} 

3) Добавьте кнопку на Ваш макет с id = "nameofthebutton" и определить это в вашем коде класса;

4) создать метод findMyLocation():

public void findMyLocation(Location loc) { 
    if(loc != null){ 
     loc.getLatitude(); 
     loc.getLongitude(); 
     String Text = "My current location is: " + 
     "Latitude = " + loc.getLatitude() + 
     "Longitude = " + loc.getLongitude(); 
     Toast.makeText(getApplicationContext(), 
     Text, 
     Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

Я получаю эту ошибку: 'java.lang.IllegalStateException: Не удалось найти метод myLocationFinder (View) в класс активности ali.projecto.MainActivity для обработчика onClick в классе вида android.widget.Button с id 'button'' –

+0

SnowTauren попробует второй метод, это работает obbligatory :) –

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