2013-06-03 29 views
25

我是新的Android編碼器,並且在請求本地化更新時遇到問題。它是如何工作的 - requestLocationUpdates()+ LocationRequest/Listener

我使用http://developer.android.com/training/location/receive-location-updates.html的教程。

我的應用程序可以處理異常,正確獲取緯度和格式,地理編碼器可以處理顯示地址。但我只要求一次位置 - 或位置發生變化。我想要做時間間隔。現在我開始從教程中實現代碼,它看起來像這樣:

public class MainActivity extends Activity implements 
GooglePlayServicesClient.ConnectionCallbacks, 
GooglePlayServicesClient.OnConnectionFailedListener, 
LocationListener { 

private static final int MILLISECONDS_PER_SECOND = 1000; 

public static final int UPDATE_INTERVAL_IN_SECONDS = 5; 
private static final long UPDATE_INTERVAL = 
      MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS; 

private static final int FASTEST_INTERVAL_IN_SECONDS = 1; 
private static final long FASTEST_INTERVAL = 
      MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS; 

private TextView tvStatus; 
private TextView tvLatitude; 
private TextView tvLongitude; 

LocationRequest mLocationRequest; 
LocationClient mLocationClient; 
Location mCurrentLocation; 

boolean bNetworkEnabled; 
boolean bGPSEnabled; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    tvStatus = (TextView)findViewById(R.id.tvStatus); 
    tvLatitude = (TextView)findViewById(R.id.tvLatitude); 
    tvLongitude = (TextView)findViewById(R.id.tvLongitude); 

    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
    mLocationClient = new LocationClient(this, this, this); 

    checkProviders(); 
} 

因此,已經有間隔實施和位置請求。但在我給的鏈接之前有一個評論,我應該使用requestLocationUpdates()(可能是onCreate()onStart()onStop()刪除請求),但我有問題。所以,Eclipse給我展示了3種方法:

requestLocationUpdates(LocationRequest request, LocationListener listener) 
requestLocationUpdates(LocationRequest request, PendingIntent CallbackIntent) 
requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper) 

所以我覺得第一個在這個地方是最正確的。我應該在LocationListener插槽中放置什麼?我請求解釋它是如何工作的。

回答

30

要實現LocationListener的在您的活動MainActivity中。呼籲併發位置更新爲此將是這樣的:

mLocationClient.requestLocationUpdates(mLocationRequest, this); 

確保你實施LocationListener的是來自谷歌的API,那就是導入此:

import com.google.android.gms.location.LocationListener; 

,而不是這樣的:

import android.location.LocationListener; 

它應該工作得很好。

在執行此操作之前,LocationClient確實已連接也很重要。我建議你不要在onCreate或onStart方法中調用它,而是在onResume中調用它。在Google Location Api的教程中,這一切都得到了很好的解釋:https://developer.android.com/training/location/index.html

+1

正是我搞砸了。謝謝。 :) –

+0

所以我知道'requestLocationUpdates'將返回Location到PendingIntent,但我可以在哪裏訪問返回的位置? – geckob

+2

要調用此請求,您需要一個類來實現LocationUpdates。該實現具有方法OnLocationChanged(位置位置)。這是您訪問返回位置的地方。公共類MyLocationListener實現LocationListener {...} – Totalys

7

我使用這一個:

LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) 

例如,使用一個1秒的時間間隔:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this); 

的時間以毫秒爲單位的距離以米爲單位。

這會自動調用:

public void onLocationChanged(Location location) { 
    //Code here, location.getAccuracy(), location.getLongitude() etc... 
} 

我也有這些包含在腳本但沒有實際使用它們:

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

簡而言之:

public class GPSClass implements LocationListener { 

    public void onLocationChanged(Location location) { 
     // Called when a new location is found by the network location provider. 
     Log.i("Message: ","Location changed, " + location.getAccuracy() + " , " + location.getLatitude()+ "," + location.getLongitude()); 
    } 

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

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this); 
    } 
} 
+3

距離**總是**米。 – hd1

+0

它不會自動運行。當位置改變時,onLocationChanged被調用。而在某些情況下需要時間 –

相關問題