Có thể lấy vị trí hiện tại của người dùng mà không cần sử dụng GPS hoặc internet không? Ý tôi là với sự trợ giúp của nhà cung cấp mạng di động.
Có thể lấy vị trí hiện tại của người dùng mà không cần sử dụng GPS hoặc internet không? Ý tôi là với sự trợ giúp của nhà cung cấp mạng di động.
Câu trả lời:
Những gì bạn đang muốn làm là có được vị trí bằng cách sử dụng LocationManager.NETWORK_PROVIDER
thay vì LocationManager.GPS_PROVIDER
. Điều NETWORK_PROVIDER
này sẽ giải quyết trên GSM hoặc wifi, từng có sẵn. Rõ ràng khi tắt wifi, GSM sẽ được sử dụng. Hãy nhớ rằng sử dụng mạng di động về cơ bản là chính xác đến 500m.
http://developer.android.com/guide/topics/location/obtaining-user-location.html có một số thông tin và mã mẫu thực sự tuyệt vời.
Sau khi bạn hoàn thành hầu hết các mã OnCreate()
, hãy thêm mã này:
// 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.NETWORK_PROVIDER, 0, 0, locationListener);
Bạn cũng có thể có hoạt động của bạn triển khai LocationListener
lớp học và do đó thực hiện onLocationChanged()
trong hoạt động của bạn.
Bằng cách nhận được getLastKnownLocation
bạn không thực sự tự bắt đầu sửa chữa.
Cần biết rằng điều này có thể bắt đầu nhà cung cấp, nhưng nếu người dùng đã từng có vị trí trước đó, tôi không nghĩ nó sẽ làm được. Các tài liệu không thực sự quá rõ ràng về điều này.
Theo tài liệu getLastKnownLocation:
Trả về Vị trí cho biết dữ liệu từ lần sửa vị trí đã biết gần đây nhất thu được từ nhà cung cấp nhất định. Điều này có thể được thực hiện mà không cần khởi động trình cung cấp.
Đây là một đoạn mã nhanh:
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import java.util.List;
public class UtilLocation {
public static Location getLastKnownLoaction(boolean enabledProvidersOnly, Context context){
LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Location utilLocation = null;
List<String> providers = manager.getProviders(enabledProvidersOnly);
for(String provider : providers){
utilLocation = manager.getLastKnownLocation(provider);
if(utilLocation != null) return utilLocation;
}
return null;
}
}
Bạn cũng phải thêm quyền mới vào AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
PASSIVE_PROVIDER
, NETWORK_PROVIDER
và GPS_PROVIDER
.
boolean gps_enabled = false;
boolean network_enabled = false;
LocationManager lm = (LocationManager) mCtx
.getSystemService(Context.LOCATION_SERVICE);
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Location net_loc = null, gps_loc = null, finalLoc = null;
if (gps_enabled)
gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (network_enabled)
net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (gps_loc != null && net_loc != null) {
//smaller the number more accurate result will
if (gps_loc.getAccuracy() > net_loc.getAccuracy())
finalLoc = net_loc;
else
finalLoc = gps_loc;
// I used this just to get an idea (if both avail, its upto you which you want to take as I've taken location with more accuracy)
} else {
if (gps_loc != null) {
finalLoc = gps_loc;
} else if (net_loc != null) {
finalLoc = net_loc;
}
}
Không, bạn hiện không thể xác định vị trí nếu không sử dụng GPS hoặc internet.
Các kỹ thuật định vị dựa trên WiFi, Cellular hoặc Bluetooth hoạt động với sự trợ giúp của cơ sở dữ liệu lớn liên tục được cập nhật. Một thiết bị quét các ID thiết bị truyền và sau đó gửi các ID này trong một truy vấn thông qua internet tới một dịch vụ như Google, Apple hoặc Skyhook. Dịch vụ đó phản hồi với một vị trí dựa trên các cuộc khảo sát không dây trước đó từ các vị trí đã biết. Nếu không có truy cập internet, bạn phải có một bản sao cục bộ của cơ sở dữ liệu như vậy và luôn cập nhật thông tin này. Đối với việc sử dụng toàn cầu, điều này là rất không thực tế.
Về mặt lý thuyết, một nhà cung cấp dịch vụ di động chỉ có thể cung cấp dịch vụ dữ liệu cục bộ nhưng không có quyền truy cập internet, sau đó trả lời các truy vấn vị trí từ thiết bị di động. Các nhà cung cấp dịch vụ di động không làm điều này; không ai muốn trả tiền cho loại truy cập dữ liệu bị hạn chế này. Nếu bạn có dịch vụ dữ liệu thông qua nhà cung cấp dịch vụ di động, thì bạn có quyền truy cập internet.
Tóm lại, việc sử dụng LocationManager.NETWORK_PROVIDER hoặc android.hardware.location.network để xác định vị trí yêu cầu sử dụng internet.
Sử dụng vị trí đã biết gần đây nhất yêu cầu bạn phải có GPS hoặc truy cập internet gần đây. Nếu bạn vừa có internet, có lẽ bạn có thể điều chỉnh vị trí hoặc cài đặt của mình để có internet trở lại. Nếu thiết bị của bạn chưa có GPS hoặc truy cập internet, tính năng vị trí đã biết cuối cùng sẽ không giúp được bạn.
Nếu không có GPS hoặc Internet, bạn có thể:
Tại đây có thể có được vị trí hiện tại của Người dùng mà không cần sử dụng GPS và Nhà cung cấp mạng.
1. Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"
Bạn đã xem qua Google Maps Geolocation Api chưa? Vị trí địa lý của Google Map
Đây là RestApi đơn giản, bạn chỉ cần ĐĂNG yêu cầu, dịch vụ sẽ trả về vị trí với độ chính xác tính bằng mét.
Dường như có thể theo dõi điện thoại thông minh mà không cần sử dụng GPS.
Nguồn:
Chính: "PinMe: Theo dõi người dùng điện thoại thông minh trên khắp thế giới"
Phụ: "Cách theo dõi điện thoại di động mà không cần GPS — hoặc Sự đồng ý"
Tôi vẫn chưa tìm thấy liên kết đến mã cuối cùng của nhóm. Khi tôi làm, tôi sẽ đăng, nếu người khác chưa làm như vậy.