2013-11-20 36 views
0

我正在開發一個Android項目,讓用戶可以打開他的GPS。他的位置被要求啓動該應用程序。爲什麼激活GPS不足以獲取用戶的位置?

激活後,我使用LocationManager的getLastKnownLocation,但此方法返回一個位置,指示從給定提供程序獲取的最後一次已知位置定位的數據。該文件解釋說,這可以在無需啓動提供程序的情況下完成。請注意,此位置可能已過時,例如,如果設備已關閉並移至其他位置。

但是用戶激活本地化服務。因此,打開GPS並不足以啓動GPS,因爲它是通過在Google地圖上顯示設備頂部的圖標並檢索GPS座標來完成的。當我的應用程序給用戶激活GPS的可能性時(看起來很奇怪),這個圖標不會出現。

我選擇最好的提供者後,我已經閱讀過的Theards使用getLastKnownLocation方法。開啓GPS服務後,我錯過了什麼? GPS啓動時GPS是否自動啓動?

我已經問過this,但答案還不夠。

回答

1

用於顯示在地圖上用藍點圖標此行

map_fragment.setMyLocationEnabled(true); 

使用此代碼來得到你想要得到的位置

 GPSTracker gps = new GPSTracker(this); 
      Double latiDouble = gps.getLatitude(); 


      Double loDouble = gps.getLongitude(); 
位置

創建一個GPSTracker類並添加此代碼

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 
    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; //10 meters 
    private static final long MIN_TIME_BW_UPDATES=1000*60*1; //1 minute 
    private LocationManager locationManager; 

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

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

     isGPSEnabled=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

     isNetworkEnabled=locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if(!isGPSEnabled && !isNetworkEnabled) 
     { 
      //showSettingAlert(); 
     } 
     else 
     { 
      this.canGetLocation=true; 

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

     } 
     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 showSettingAlert() 
    { 
     AlertDialog.Builder alertDialog=new AlertDialog.Builder(mContext); 
     alertDialog.setTitle("GPS Settings"); 
     alertDialog.setMessage("GPS is not enabled .Do you want to go to settings menu ?"); 

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

      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       Intent i=new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(i); 
      } 
     }); 
     alertDialog.setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       dialog.cancel(); 
      } 
     }); 
    } 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 


    } 

    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

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



} 
1

不,打開GPS是不夠的,您還需要位置監聽器來偵聽位置更新。

喜歡的東西在Location Strategies

// Acquire a reference to the system Location Manager 
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

// Define a listener that responds to location updates 
LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     // Called when a new location is found by the network location provider. 
     makeUseOfNewLocation(location); 
    } 

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

    public void onProviderEnabled(String provider) {} 

    public void onProviderDisabled(String provider) {} 
}; 

// Register the listener with the Location Manager to receive location updates 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);