2013-09-20 2 views
0

Мне нужно получить myLocation с помощью GPS, как его получить? Я пробую следующий код, но он работает не когда-либо. Когда я перезагружаю свой телефон и запускаю приложение, он не работает.Получить текущее местоположение с помощью GPS, без сети

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.util.Log; 

public class GPSTraker extends Service implements LocationListener { 

private final Context mContext; 

// flag for GPS status 
boolean isGPSEnabled = false; 

// flag for network status 
boolean isNetworkEnabled = false; 

// flag for GPS status 
boolean canGetLocation = false; 

Location location; // location 
double latitude; // latitude 
double longitude; // longitude 

// The minimum distance to change Updates in meters 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 10 meters 

// The minimum time between updates in milliseconds 
private static final long MIN_TIME_BW_UPDATES = 3000; // 1 minute 

// Declaring a Location Manager 
protected LocationManager locationManager; 

public GPSTraker(Context context) { 
    this.mContext = context; 
    getLocation(); 
} 

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext 
       .getSystemService(LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

     // getting network status 
     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) { 
      // no network provider is enabled 
     } else { 
      this.canGetLocation = true; 
      if (isNetworkEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       Log.d("Network", "Network"); 
       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
      // if GPS Enabled get lat/long using GPS Services 
      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS Enabled", "GPS Enabled"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return location; 
} 

/** 
* Stop using GPS listener Calling this function will stop using GPS in your 
* app 
* */ 
public void stopUsingGPS() { 
    if (locationManager != null) { 
     locationManager.removeUpdates(GPSTraker.this); 
    } 
} 

/** 
* Function to get latitude 
* */ 
public double getLatitude() { 
    if (location != null) { 
     latitude = location.getLatitude(); 
    } 

    // return latitude 
    return latitude; 
} 

/** 
* Function to get longitude 
* */ 
public double getLongitude() { 
    if (location != null) { 
     longitude = location.getLongitude(); 
    } 

    // return longitude 
    return longitude; 
} 

/** 
* Function to check GPS/wifi enabled 
* 
* @return boolean 
* */ 
public boolean canGetLocation() { 
    return this.canGetLocation; 
} 

/** 
* Function to show settings alert dialog On pressing Settings button will 
* lauch Settings Options 
* */ 
public void showSettingsAlert() { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    // Setting Dialog Title 
    alertDialog.setTitle("GPS is settings"); 

    // Setting Dialog Message 
    alertDialog 
      .setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

    // On pressing Settings button 
    alertDialog.setPositiveButton("Settings", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        Intent intent = new Intent(
          Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
        mContext.startActivity(intent); 
       } 
      }); 

    // on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
} 

@Override 
public void onProviderDisabled(String provider) { 
} 

@Override 
public void onProviderEnabled(String provider) { 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 

} 
} 

и использовать его:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.fragment_near_new, null); 
    elvMain = (ExpandableListView) v.findViewById(R.id.elvMain); 
    GPSTraker gps = new GPSTraker(getActivity()); 

    if (gps.canGetLocation()) { 
     myLat = gps.getLatitude(); 
     myLong = gps.getLongitude(); 
     Log.d("myDebug", "new get Location +" + myLat); 
     // \n is for new line 

    } else { 
     // can't get location 
     // GPS or Network is not enabled 
     // Ask user to enable GPS/network in settings 
     Log.d("myDebug", "Can not get location"); 
     gps.showSettingsAlert(); 
    } 


    return v; 
} 

Что это неправильно? Может быть, у кого-то есть идеи, как это решить? После перезагрузки мой телефон this program не может получить мое местоположение.

ответ

1

Вы хотите, чтобы постоянное обновление местоположения или просто одно место?

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

Некоторые основы на LocationManager:

При запуске, необходимо запросить экземпляр LocationManager и затем вызвать RequestLocationUpdates(), передавая в качестве аргумента класс, который будет получать обновления местоположения. Когда будет доступно новое местоположение, LocationManager вызовет onLocationChanged(), передав текущее местоположение в качестве аргумента.

Глядя на ваш код, у вас есть все это есть, но в неправильных местах:

  • Большая часть кода в методе getLocation() должен идти в onCreate().
  • Вызов requestLocationUpdates() должен идти в вашем сервисе onStartCommand(). Вы должны отменить регистрацию, вызвав removeUpdates() в свой метод stopSelf(), чтобы GPS был освобожден, когда ваша служба остановлена. (Для работы сделайте это в onResume() и onPause(), иначе в противном случае он будет поддерживать бодрствование и разряжать батарею даже после прекращения службы/пользователя от активности до тех пор, пока система не убьет приложение.)
  • код для обработки обновления местоположения, который вы разместили в onCreateView(), должен перейти в onLocationChanged().

Я вижу, вы также звоните LocationManager.getLastKnownLocation(). Это получит последнее место, которое ранее получил LocationManager, но он не запустит GPS. Если ни одно другое приложение не запросило обновление местоположения раньше (с использованием requestLocationUpdates()), у него нет места для сообщения, и если устройство перемещается с момента последней позиции, вы получите устаревшую позицию.

Если вам требуется одно обновление местоположения надежным способом и с обновленной информацией, выполните приведенные выше инструкции и поместите вызов removeUpdates() в свой метод onLocationChanged(). Это выведет GPS после первого обновления местоположения. Обратите внимание, что вам может потребоваться некоторое время для обновления местоположения, поскольку GPS может занять некоторое время для запуска.

+0

Я попробую сейчас и отправил вам свой результат, я хочу обновлять свое местоположение каждые 30 секунд. –

+0

«Большая часть кода в методе getLocation() должна перейти в onCreate()». onCreate метод класса, который вызывает gpsTracker? –

+0

Метод 'onCreate()' 'службы, который вы уже создали. Я только что увидел, что класс - это «Сервис», а не «Активность», и соответственно обновил мой ответ. – user149408

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