是否可以在不使用GPS或互联网的情况下获取用户的当前位置?我的意思是在移动网络提供商的帮助下。
是否可以在不使用GPS或互联网的情况下获取用户的当前位置?我的意思是在移动网络提供商的帮助下。
Answers:
您要做的是使用LocationManager.NETWORK_PROVIDER
而不是获取职位LocationManager.GPS_PROVIDER
。在NETWORK_PROVIDER
将解决在GSM或WiFi,这永远可用。显然,关闭wifi后,将使用GSM。请记住,使用小区网络的精度基本上可以达到500m。
http://developer.android.com/guide/topics/location/obtaining-user-location.html提供了一些非常有用的信息和示例代码。
完成中的大多数代码后OnCreate()
,添加以下代码:
// 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);
您也可以让您的活动实现LocationListener
该类,从而onLocationChanged()
在您的活动中实现。
通过获取,getLastKnownLocation
您实际上不会自己启动修复程序。
请注意,这可以启动提供程序,但是如果用户以前曾获得过某个位置,我认为不会。文档对此并不十分清楚。
根据文档getLastKnownLocation:
返回一个位置,该位置指示从给定提供者获得的最新已知位置修复中的数据。这可以在不启动提供程序的情况下完成。
这是一个简短的片段:
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;
}
}
您还必须向添加新权限 AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
PASSIVE_PROVIDER
,NETWORK_PROVIDER
以及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;
}
}
不,您当前无法使用GPS或互联网获取位置。
基于WiFi,蜂窝或蓝牙的定位技术可以在不断更新的大型数据库的帮助下工作。设备扫描发射机ID,然后通过互联网在查询中发送这些ID将其到Google,Apple或Skyhook等服务。该服务将根据先前来自已知位置的无线调查以一个位置作为响应。如果没有Internet访问,则必须拥有此类数据库的本地副本,并保持最新状态。对于全球使用,这是非常不切实际的。
从理论上讲,移动提供商只能提供本地数据服务,而不能访问互联网,然后回答来自移动设备的位置查询。移动提供商不这样做。没有人愿意为这种受限的数据访问付费。如果您通过移动运营商提供数据服务,则可以访问互联网。
简而言之,使用LocationManager.NETWORK_PROVIDER或android.hardware.location.network获取位置需要使用互联网。
使用最近的位置需要您最近拥有GPS或Internet访问。如果您只有互联网,大概可以调整您的位置或设置来重新获得互联网。如果您的设备没有GPS或互联网访问权限,那么最近的已知位置功能将无济于事。
没有GPS或互联网,您可以:
您是否看过Google Maps Geolocation Api?Google Map地理位置
这是简单的RestApi,您只需要POST请求,该服务将以米为单位返回准确的位置。
似乎可以在不使用GPS的情况下跟踪智能手机。
资料来源:
我尚未找到团队最终代码的链接。如果没有其他人,我会在发布时发布。