OK, tôi đã dành một loạt thời gian tìm kiếm và đọc, chứ không phải chỉ trang web này. Hầu hết các chủ đề đối phó với GPS hoặc cố gắng để có được nó để làm việc trong một trình mô phỏng. Tài liệu tại developer.android.com chỉ giải thích tối đa một điểm. Tôi không thể có được một điều đơn giản để làm việc. Giống như hầu hết mọi người có vấn đề này, tôi chỉ muốn có vị trí cuối cùng được biết từ nhà cung cấp mạng và không nhận được nó, ngay cả sau khi tôi sử dụng bản đồ Google (sử dụng nhà cung cấp mạng vì GPS bị tắt) và nó cho tôi thấy chỉ cách 1/8 đến 1/4 dặm. Ok, do đó, "nhà cung cấp" (tháp di động/wi-fi nếu được bật) đang sửa chữa các bản đồ của Google. Tôi thử ứng dụng của mình và không thể có được vị trí đã biết cuối cùng. Tôi thậm chí không cố gắng để hiển thị nó trong Bản đồ, tôi đang có nó in lat và dài tọa độ vào màn hình sau khi một nút bấm để có được vị trí. Tài liệu không nói gì về vị trí cuối cùng phải được thực hiện từ cùng một hoạt động. Nó nói nó sẽ trả về vị trí đã biết cuối cùng từ nhà cung cấp được chỉ định. Tôi đang chỉ định NETWORK_PROVIDER mà tài liệu nói là tháp di động và wi-fi. (Và vâng, tôi có được bảo hiểm trong bản kê khai.)getLastKnownĐịa điểm từ NETWORK_PROVIDER trên điện thoại trả về null
Có ai biết nó hoạt động như thế nào không? Tôi chưa thấy giải thích tốt, ngay cả trên trang web của Google. Nếu bạn không thể nói, tôi thất vọng. Nó rõ ràng là một cái gì đó tôi đang làm (hay không), vì vậy tôi không đổ lỗi cho bất cứ điều gì/bất cứ ai, nhưng bản thân mình, ngoại trừ tài liệu mà rơi một chút quá ngắn cho nhu cầu của tôi.
CẬP NHẬT: Tôi hiện đang sử dụng trình xử lý vị trí và nhận vị trí, tôi đoán vị trí cuối cùng. Có vẻ hợp lý để có thể có được vị trí cuối cùng mà không bắt đầu cập nhật vị trí thông qua một người nghe vị trí, nhưng tôi đã không, và bây giờ tôi đang có một người nghe vị trí.
Vấn đề của tôi là tôi không thể thay đổi vị trí. Mã của tôi hiện không làm bất cứ điều gì ngoại trừ cố gắng để có được cập nhật vị trí thông qua người nghe, và cũng chấp nhận một nút bấm để cướp vị trí đã biết cuối cùng. Google Maps sẽ cho tôi xem tôi đang ở đâu, nhưng tôi cứ bị một vị trí 20 dặm trong mã của tôi. Tôi có một cảm giác có một cơ hội tôi thực sự có thể nhận được một vị trí mới, nhưng tôi có thể có một lỗi sử dụng khai báo cuối cùng/tĩnh đang giữ cho tôi lưu trữ và sử dụng vị trí đó khi tôi cần nó. Tệp kê khai của tôi có quyền truy cập internet và fine_location và xml cho hoạt động hoạt động tốt - nó chỉ cung cấp nút để bật/tắt tìm kiếm trực tiếp cho vị trí, nút để truy xuất lastknownlocation và xem văn bản để hiển thị vĩ độ và kinh độ. Tôi đã cố gắng loại bỏ những điều không cần thiết để giữ cho điều này không quá dài.
public class RMain extends Activity {
public boolean islivesearchon;
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters
private static Location currentlocation;
private LocationManager locationManager;
private LocationListener locationListener;
public static Criteria criteria;
public TextView latview;
public TextView longview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rmain);
latview = (TextView) findViewById(R.id.display_latitude);
longview = (TextView) findViewById(R.id.display_longitude);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// setup bestProvider
criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestprovider = locationManager.getBestProvider(criteria, true);
// get an initial current location
currentlocation = locationManager.getLastKnownLocation(bestprovider);
latview.setText(Double.toString(currentlocation.getLatitude()));
longview.setText(Double.toString(currentlocation.getLongitude()));
// Define locationListener interface
locationListener = new LocListener();
// React to LiveSearch toggle button press
final Button livesearch = (Button) findViewById(R.id.button_livesearch);
livesearch.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TextView livesearchview = (TextView) findViewById(R.id.button_livesearch);
boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(islivesearchon) {
locationManager.removeUpdates(locationListener);
islivesearchon = false;
livesearchview.setText("Live Search is OFF");
}
else {
// ideally should check for !isProviderEnabled first, then provide option for turning it on
if(isNetEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener);
islivesearchon = true;
livesearchview.setText("Live Search is ON");
}
// ideally should check for !isProviderEnabled first, then provide option for turning it on
if(isGpsEnabled) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener);
islivesearchon = true;
livesearchview.setText("Live Search is ON");
}
}
}
});
// Respond to Get Location button click to get last known location
final Button getlocation = (Button) findViewById(R.id.button_getlocation);
getlocation.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String bestprovider = locationManager.getBestProvider(criteria, true);
Location lastlocation = locationManager.getLastKnownLocation(bestprovider);
latview.setText(Double.toString(lastlocation.getLatitude()));
longview.setText(Double.toString(lastlocation.getLongitude()));
}
});
}
private class LocListener implements LocationListener {
@Override
public void onLocationChanged(Location latestlocation) {
// Called when a new location is found by the network location provider.
currentlocation.set(latestlocation);
latview.setText(Double.toString(currentlocation.getLatitude()));
longview.setText(Double.toString(currentlocation.getLongitude()));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
};
}
Bạn có sim trong điện thoại của mình không? –
Chỉ cần đặt bất kỳ vị trí nào tại thời điểm bắt đầu ứng dụng trước, sau đó truy xuất getLastKnownLocation ... –
Xin cảm ơn các bạn. Có, tôi chỉ mô phỏng bên trong điện thoại của tôi - trình giả lập trong Eclipse không phải lúc nào cũng chạy đúng cho tôi. – crispy