91

是否可以在不使用 GPS 或互联网的情况下获取用户的当前位置?我的意思是在移动网络提供商的帮助下。

4

8 回答 8

87

您要做的是使用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()在您的活动中实现。

于 2011-07-14T14:55:45.167 回答
18

通过获取,getLastKnownLocation您实际上并没有自己启动修复。

请注意,这可能会启动提供程序,但如果用户以前曾经获得过位置,我认为不会。文档对此并不太清楚。

根据文档 getLastKnownLocation:

返回一个 Location 指示从给定提供程序获得的最后一个已知位置修复的数据。这可以在不启动提供程序的情况下完成。

这是一个快速的片段:

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" />
于 2011-07-14T14:05:16.957 回答
5

不,您目前无法在不使用 GPS 或互联网的情况下获取位置。

基于 WiFi、蜂窝或蓝牙的定位技术在不断更新的大型数据库的帮助下工作。设备会扫描发射器 ID,然后通过互联网将其发送到 Google、Apple 或 Skyhook 等服务的查询中。该服务以基于已知位置的先前无线勘测的位置进行响应。如果没有 Internet 访问权限,您必须拥有此类数据库的本地副本并保持最新状态。对于全局使用,这是非常不切实际的。

理论上,移动提供商可以只提供本地数据服务,但不能访问互联网,然后回答来自移动设备的位置查询。移动提供商不这样做;没有人愿意为这种受限的数据访问付费。如果您通过移动提供商获得数据服务,那么您就可以访问互联网。

简而言之,使用 LocationManager.NETWORK_PROVIDER 或 android.hardware.location.network 获取位置需要使用互联网。

使用最后一个已知位置要求您最近有 GPS 或互联网访问权限。如果您刚刚上网,大概您可以调整您的位置或设置以再次上网。如果您的设备没有 GPS 或互联网接入,最后已知的位置功能将无济于事。

如果没有 GPS 或互联网,您可以:

  1. 拍摄夜空照片并使用当前时间根据星图估计您的位置。这可能需要额外的设备来确保正确测量图片的角度。
  2. 使用加速度计从已知位置开始跟踪位置。这种方法的错误累积使得它在大多数情况下不切实际。
于 2017-09-03T16:43:41.493 回答
4
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;
    }
}
于 2016-12-14T09:45:26.017 回答
3

这里可以在不使用 GPS 和网络提供商的情况下获取用户当前位置。

1.Convert cellLocation to real location (Latitude and Longitude), using "http://www.google.com/glm/mmap"

2.单击此处供您参考

于 2016-04-16T06:54:57.393 回答
2

你看过谷歌地图地理定位 API 吗?谷歌地图地理位置

这是一个简单的 RestApi,您只需要 POST 一个请求,该服务将返回一个以米为单位的精确位置。

于 2016-06-11T09:08:04.880 回答
-1

似乎可以在不使用 GPS 的情况下跟踪智能手机。

资料来源:

主要:“PinMe:跟踪世界各地的智能手机用户”

次要:“如何在没有 GPS 或同意的情况下跟踪手机”

我还没有找到团队最终代码的链接。当我这样做时,我会发布,如果另一个人没有这样做。

于 2018-05-31T21:41:32.877 回答
-2

您可以使用 TelephonyManager 来执行此操作。

于 2019-04-02T09:56:22.197 回答