2015-04-02 112 views
4

我试图访问我的设备的GPS位置,因此我可以使用它在用户坐标上加载Google地图。我遵循了各种指南,但我似乎没有获得任何正确的价值观。Q. Android GPS位置

的应用程序不会崩溃,它只是显示一个零

这里是我的地图活动代码:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBarActivity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.Toast; 

public class Maps extends ActionBarActivity { 

Button btnLocation; 
GPSTracker gps; 


//private GoogleMap map; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Hide action bar before Activity load 
    getSupportActionBar().hide(); 
    setContentView(R.layout.activity_maps); 


    btnLocation = (Button) findViewById(R.id.btnLocation); 

    btnLocation.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      gps = new GPSTracker(Maps.this); 

      if(gps.canGetLocation()){ 
       double latitude = gps.getLatitude(); 
       double longitude = gps.getLongitude(); 

       Toast.makeText(getApplicationContext(), 
         "Your location is -\nLat: " + latitude + 
         "\nLong: " + longitude, Toast.LENGTH_LONG).show(); 
      } else { 
       gps.showSettingsAlert(); 
      } 
     } 
    }); 

下面是我的代码,是为了获得位置

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; 

public class GPSTracker extends Service implements LocationListener { 

    private final Context context; 
//Flags for network/gps status 
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; 

public 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; 
      //For use over networks 
      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(); 
        } 
       } 
      } 
      //For use over GPS 
      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(); 
    } else { 
     getLocation(); 
    } 
    return latitude; 
} 

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



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

    alertDialog.setTitle("GPS is being set"); 

    alertDialog.setMessage("GPS is not enabled. Go to settings."); 

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


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

我也包括必要的代码进入清单:

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

帮助是极大的赞赏

回答

3

不要使用GPSTracker !!!!亲爱的上帝,这段代码不会死。它的可怕,糟糕,糟糕的代码。我在http://gabesechansoftware.com/location-tracking/上有一篇博客文章,展示了代码有缺陷的十几种不同方式。我在那里也有更好的实施。该代码是由不完全了解位置跟踪的人编写的,而且会做出很多错误的假设。

如果我被允许从这个网站删除一个类,它将被提及的那一个。它只是非常天真的代码。

+0

你是真棒的家伙。 – 2015-04-03 00:42:18

+0

感谢您的回复。在这篇文章之后,我发现很多人抱怨这段代码,不幸的是我对Java很陌生。我想得到这个工作,但我想我会尝试一个不同的实现。 – Jordan 2015-04-03 12:29:29

+0

@加贝我看过你的代码,但是你如何实现它,没有样本可以使用你的代码。请你能提供一个样品 – Djama 2017-05-05 11:20:24