Tôi đang viết một ứng dụng yêu cầu vị trí hiện tại của người dùng (lastknownlocation sẽ không hữu ích) và hiển thị danh sách tất cả các mục "gần nhất" được lấy từ cơ sở dữ liệu.Android tìm vị trí GPS một lần, hiển thị hộp thoại tải
Tôi đã tìm thấy các mục gần nhất hoạt động tốt nhưng chỉ sử dụng vị trí kinh độ và vĩ độ được mã hóa trong lúc này nhưng bây giờ là lúc để thực hiện tìm vị trí thực tế.
Bất kỳ ai cũng có thể cung cấp ví dụ về cách ứng dụng tìm vị trí hiện tại trong nền và yêu cầu ứng dụng chờ. Tôi chỉ cần vị trí một lần không cập nhật khi người đó di chuyển. Tôi đã thực hiện một người nghe vị trí tuy nhiên tôi hiểu việc sửa chữa GPS có thể chậm. Tôi đã thấy các ví dụ khác sử dụng vị trí đã biết cuối cùng hoặc triển khai trình nghe vị trí tiếp tục chạy và cập nhật tuy nhiên khi Hoạt động của tôi cần tọa độ vị trí trước khi nó có thể hiển thị mọi thứ mà ứng dụng chỉ gặp sự cố. Tôi cần hiển thị Hộp thoại tiến trình trong khi tìm kiếm.
Tôi làm cách nào để trình điều khiển vị trí chạy một lần trong nền và sau đó xóa các cập nhật vị trí khi tìm thấy vị trí đó. Tôi cần phần còn lại của ứng dụng để chờ cho đến khi nó có vị trí GPS hoặc hết thời gian chờ sau 20-30 giây. Tôi muốn có một ProgressDialog để người dùng biết rằng một cái gì đó đang diễn ra, nhưng nó chỉ là hoạt hình tải quay không phải là một tỷ lệ phần trăm hay bất cứ thứ gì. Nếu có thể, tôi muốn người dùng có thể hủy hộp thoại nếu họ bị bệnh chờ đợi sau đó họ có thể tìm kiếm bằng cách nhập ngoại ô, vv thay vào đó.
Tôi đã cố gắng để làm điều đó với chủ đề nhưng nó là nhận được cách phức tạp hơn tôi cảm thấy nó nên được và vẫn không làm việc anyway. Trên iPhone, điều này đơn giản hơn nhiều?
Bất cứ ai có thể cung cấp một cách tốt đẹp để làm điều này, tôi đã tách tóc của tôi ra trong một tuần về điều này và nó thực sự đưa tôi đằng sau lịch trình cho phần còn lại của ngày hoàn thành ứng dụng.
Nói tóm lại tôi muốn:
* Tìm tọa độ hiện tại
* Hiện Progress Dialog trong khi nhận được vị trí
* Có ứng dụng có thể chờ đợi cho vị trí thành công hay từ bỏ sau một thời gian nhất định?
* Nếu thành công: Loại bỏ hộp thoại tiến trình và sử dụng tọa độ để chạy các phương pháp khác của tôi để tìm kiếm các mục gần đúng.
* Nếu không thể nhận vị trí: Bỏ qua hộp thoại tiến trình và hiển thị thông báo lỗi và khuyến khích người dùng sử dụng menu để chuyển đến Hoạt động tìm kiếm.
* Sử dụng các tọa độ này nếu người dùng chọn chế độ xem bản đồ từ trình đơn, để hiển thị vị trí hiện tại trên bản đồ và ghim ở tất cả các mục lân cận bằng cách sử dụng tọa độ của chúng từ cơ sở dữ liệu.
Cảm ơn các bạn, tôi hy vọng tôi đã giải thích cho bản thân mình đủ tốt. Mọi câu hỏi chỉ hỏi, tôi sẽ kiểm tra lại thường xuyên vì tôi muốn hoàn thành phần này. Cheers
EDIT
Mã theo yêu cầu
tập tin hoạt động locationList
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the stuff that requires current location
}
}
public LocationResult locationResult = new LocationResult()
{
@Override
public void gotLocation(final Location location)
{
currentLocation = location;
}
};
lớp LocationHelper
package org.xxx.xxx.utils;
import java.util.Timer;
/*
imports
*/
public class LocationHelper
{
LocationManager locationManager;
private LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public boolean getLocation(Context context, LocationResult result)
{
locationResult = result;
if(locationManager == null)
{
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}
//exceptions thrown if provider not enabled
try
{
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch (Exception ex) {}
try
{
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch (Exception ex) {}
//dont start listeners if no provider is enabled
if(!gpsEnabled && !networkEnabled)
{
return false;
}
if(gpsEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
}
if(networkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
GetLastLocation();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
private void GetLastLocation()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
Location gpsLocation = null;
Location networkLocation = null;
if(gpsEnabled)
{
gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(networkEnabled)
{
networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//if there are both values use the latest one
if(gpsLocation != null && networkLocation != null)
{
if(gpsLocation.getTime() > networkLocation.getTime())
{
locationResult.gotLocation(gpsLocation);
}
else
{
locationResult.gotLocation(networkLocation);
}
return;
}
if(gpsLocation != null)
{
locationResult.gotLocation(gpsLocation);
return;
}
if(networkLocation != null)
{
locationResult.gotLocation(networkLocation);
return;
}
locationResult.gotLocation(null);
}
public static abstract class LocationResult
{
public abstract void gotLocation(Location location);
}
}
Điều này thực sự có vẻ giống như một nỗ lực lớn chỉ để có được vị trí hiện tại một lần? Tôi không yêu cầu cập nhật hay gì cả? Có cách nào đơn giản hơn để ứng dụng chờ kết quả không? Tôi đã bị mắc kẹt trong chuyện này quá lâu rồi.
http://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-in-a/9811633#9811633 – Rajal