2015-06-16 111 views
1

我試圖讓我使用我在mainActivity.I調用的服務的用戶位置我相信我已經做了所有需要的工作,但我每次回來的問題0經度和緯度爲0! 我也添加了用戶權限,但它不工作! 這是服務類:Android GPS跟蹤器每次返回0經度和緯度

public class GPSTracker extends Service implements LocationListener{ 

private final Context context; 

boolean isGPSEnabled = false; 
boolean isNetworkEnabled = false; 
boolean canGetLocation = false; 

Location location; 

double latitude; 
double longitude; 

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; 

protected LocationManager locationManager; 

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

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

     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

     isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if(!isGPSEnabled && !isNetworkEnabled) { 

     } else { 
      this.canGetLocation = true; 

      if (isNetworkEnabled) { 

       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

        if (location != null) { 

         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 

      } 

      if(isGPSEnabled) { 
       if(location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        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; 
} 


public void stopUsingGPS() { 
    if(locationManager != null) { 
     locationManager.removeUpdates(GPSTracker.this); 
    } 
} 

public double getLatitude() { 
    if(location != null) { 
     latitude = location.getLatitude(); 
    } 
    return latitude; 
} 

public double getLongitude() { 
    if(location != null) { 
     longitude = location.getLongitude(); 
    } 

    return longitude; 
} 

public boolean canGetLocation() { 
    return this.canGetLocation; 
} 

public void showSettingsAlert() { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(context); 

    alertDialog.setTitle("GPS is settings"); 

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

    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      context.startActivity(intent); 
     } 
    }); 

    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    alertDialog.show(); 
} 

@Override 
public void onLocationChanged(Location arg0) { 
    // TODO Auto-generated method stub 
    this.location = location; 
    getLatitude(); 
    getLongitude(); 
} 

@Override 
public void onProviderDisabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
    // TODO Auto-generated method stub 

} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

,這是我怎麼稱呼它在MainActivity:

public class MainActivity extends Activity { 

GPSTracker gps; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    gps = new GPSTracker(MainActivity.this); 

    if (gps.canGetLocation()) { 
     double latitude = gps.getLatitude(); 
     double longitude = gps.getLongitude(); 
     Log.v("Your LOCATION is -" + "Lat:", latitude + "Long: " + longitude ); 
     Toast.makeText(
       getApplicationContext(), 
       "Your LOCATION is -\nLat: " + latitude + "\nLong: " 
         + longitude, Toast.LENGTH_LONG).show(); 
    } else { 
     gps.showSettingsAlert(); 
    } 





} 
} 

所有建議,歡迎

+0

你試過'將String.valueOf(緯度),將String.valueOf(經度)' –

+0

http://gabesechansoftware.com/location-tracking/ –

+0

@JoelFazio是的,我沒有,但它返回0一如既往:/ – raeX

回答

0

嗯,說實話,我不對GPSTracker太熟悉了,但我至少會推薦更換

public void onLocationChanged(Location arg0) { 
    // TODO Auto-generated method stub 
    this.location = location; 
    getLatitude(); 
    getLongitude(); 
} 

從我收集的內容來看,「arg0」是更新位置,從未在方法中使用過。我會建議改變它。

public void onLocationChanged(Location currentLocation) { 
    this.location = currentLocation; 
    getLatitude(); 
    getLongitude(); 
} 
+0

那也沒用!我真的很困惑! – raeX

0

我可能會建議你嘗試重構你的代碼的GPS部分?有一個新的Location API比LocationManager更易於使用,並且沒有太多的實現問題。

Fused Location Provider API管理像電源管理這樣的問題,以解決電池問題。一個很好的例子是位於Github