2013-06-03 28 views
25

Tôi là người lập trình Android mới và tôi gặp vấn đề với yêu cầu cập nhật cho bản địa hóa của tôi.Cách thức hoạt động - requestLocationUpdates() + LocationRequest/Listener

Tôi làm việc với các hướng dẫn từ http://developer.android.com/training/location/receive-location-updates.html.

Ứng dụng của tôi có thể xử lý các ngoại lệ, nhận vĩ độ và lâu dài đúng cách và trình mã hóa địa lý có thể xử lý việc hiển thị địa chỉ. Nhưng tôi chỉ yêu cầu vị trí một lần - hoặc khi thay đổi vị trí. Tôi muốn làm khoảng thời gian. Hiện tại, tôi đã bắt đầu triển khai mã từ các hướng dẫn và có vẻ như sau:

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

Vì vậy, đã có khoảng thời gian thực hiện và yêu cầu vị trí. Nhưng trong liên kết tôi đã đưa ra trước khi có một bình luận rằng tôi nên sử dụng một nơi nào đó requestLocationUpdates() (có lẽ onCreate(), onStart() và loại bỏ yêu cầu trên onStop()), nhưng tôi có vấn đề với nó. Vì vậy, Eclipse cho tôi thấy 3 phương pháp:

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

Vì vậy, cái đầu tiên tôi nghĩ là phù hợp nhất ở nơi này. Tôi nên đặt gì trong khe LocationListener? Tôi yêu cầu giúp đỡ với giải thích nhỏ như thế nào nó hoạt động.

Trả lời

30

Bạn đang triển khai LocationListener trong hoạt động của bạn MainActivity. Cuộc gọi cho cập nhật vị trí đồng thời sẽ do là như thế này:

mLocationClient.requestLocationUpdates(mLocationRequest, this); 

Hãy chắc chắn rằng LocationListener bạn đang thực hiện là từ api google, đó là nhập khẩu này:

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

và không này:

import android.location.LocationListener; 

và nó sẽ hoạt động tốt.

Điều quan trọng là LocationClient thực sự được kết nối trước khi bạn thực hiện việc này. Tôi đề nghị bạn không gọi nó trong các phương thức onCreate hoặc onStart, nhưng trong onResume. Tất cả đều được giải thích khá rõ trong hướng dẫn về Vị trí của Google Api: https://developer.android.com/training/location/index.html

+1

Chính xác những gì tôi đã làm sai.Cảm ơn bạn. :) –

+0

Vì vậy, tôi biết 'requestLocationUpdates' sẽ trả về Vị trí cho PendingIntent nhưng tôi có thể truy cập vào vị trí đã trả về ở đâu? – geckob

+2

Để gọi yêu cầu này, bạn cần một lớp học để triển khai LocationUpdates. Triển khai này có phương thức OnLocationChanged (Location location). Đây là nơi bạn truy cập vị trí được trả lại. lớp công khai MyLocationListener triển khai LocationListener {...} – Totalys

7

tôi sử dụng cái này:

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

Ví dụ, sử dụng một khoảng thời gian 1s:

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

thời gian là trong mili giây, khoảng cách là tính bằng mét.

này sẽ tự động gọi:

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

Tôi cũng đã những có trong kịch bản nhưng didnt thực sự sử dụng chúng:

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

Nói tóm lại:

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

Khoảng cách là ** luôn ** mét. – hd1

+0

Nó không tự động chạy. OnLocationChanged được gọi khi vị trí thay đổi. Và trong một số trường hợp cần có thời gian –

Các vấn đề liên quan