2015-04-02 135 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