【问题标题】:Android get User Position after restart device重启设备后Android获取用户位置
【发布时间】:2014-11-30 10:03:08
【问题描述】:

在我的应用程序中,我试图从设备中找到位置。我的代码工作很棒:

boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if(isGPSEnabled || isNetworkEnabled)
            location = locationManager.getLastKnownLocation(isGPSEnabled ? LocationManager.GPS_PROVIDER : LocationManager.NETWORK_PROVIDER);

但是重新启动设备后,我再也找不到位置了。我用另一台设备试了一下。该代码有效,重新启动后我的位置为空......这是什么?

即使打开谷歌地图,找到我的位置,我也没有得到位置......

正常吗?是否有一些解决方法或类似的方法?

编辑:

我不使用 LocationListener。我只是在 asyntask 中使用上面的代码来获得一次位置。我不想一直跟踪位置

【问题讨论】:

    标签: android geolocation locationmanager android-location


    【解决方案1】:

    在我看来,如果 GPS 已启用但尚未被调用,您将使用它的位置而不是网络位置(在这种情况下您应该使用它)。 我会用它来切换你的整个代码块:

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location == null) location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    【讨论】:

      【解决方案2】:

      你可以试试这个

      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 GPSTracker 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 = 10; // 10 meters
      
          // The minimum time between updates in milliseconds
          private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
      
          // Declaring a Location Manager
          protected LocationManager locationManager;
      
          public GPSTracker(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(GPSTracker.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;
          }
      
      }
      

      创建该类后,只需要调用canGetLocation方法即可。

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多