【问题标题】:Get current location of user in Android without using GPS or internet在不使用 GPS 或互联网的情况下获取用户在 Android 中的当前位置
【发布时间】:2011-10-05 09:10:02
【问题描述】:

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

【问题讨论】:

  • 接受的答案是否完美?对我来说它不起作用......!!!
  • 不幸的是,接受的答案是错误的 :-( 令人惊讶的是,即使它没有正确回答问题,它也得到了 28 个赞!
  • @DavidWasser 感谢您宝贵的 cmets。您是否认为实际上没有任何方法可以在不使用互联网或 gps 的情况下获取位置详细信息? (除了使用那个小区广播消息)
  • @SamithaChathuranga 想一想:如果你没有 GPS 也没有互联网,你从哪里获得这些信息?您可以从网络上获取小区 ID 信息。这只会为您提供 ID。然后,您需要一种将 ID 映射到实际坐标或名称的方法。您始终可以构建自己的小区 ID 数据库并将其包含在您的应用程序中,但是收集所有数据需要您做大量的工作,而且映射不是静态的:它会随着移动运营商安装新的手机信号塔和重新编号而发生变化他们的网络。基本上,实际的答案是“不”。
  • @DavidWasser 感谢您的回复。我也很惊讶如何在没有互联网或 gps 的情况下获得位置。但是在许多论坛中包括stackoverflow,据说这是可能的。这就是为什么我认为这是可能的。似乎很多人也被误导了。

标签: android geolocation gps android-gps


【解决方案1】:

您要做的是使用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()

【讨论】:

  • 请记得查看电池保存策略。此外,根据您的应用程序,如果其他应用程序正在使用天线,则 PASSIVE_PROVIDER 和使用 getLastKnownLocation 可能会为您节省大量工作和电池。
  • 嘿@Ian,我使用了相同的代码。但就我而言,从未调用过 onLocationChanged() 侦听器方法。我在 onResume() 方法上使用了 requestLocationUpdates。仍然没有调用.. 那么那里出了什么问题?
  • 是否可以在没有互联网的情况下获取坐标?在某些设备中,它似乎无法正常工作。
  • 这个答案是错误的 :-( OP 询问如何在不使用 Internet 连接的情况下获取位置。LOCATION_PROVIDER 需要使用 Internet 访问服务器以将 Cell-ID 和 WIFI MAC 地址的集合解析为地理坐标。如果您没有 Internet 连接,您将无法获得坐标。如果您告诉我它对您有用,这意味着您有 Internet 连接,或者您有 Internet 连接(位置 API 下载和缓存有关您周围区域的一些信息),或者位置信息过时(因此不准确)。
【解决方案2】:

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

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

根据文档 getLastKnownLocation:

返回一个 Location 指示来自最后一个已知位置的数据 从给定的提供程序获得的修复。这可以在没有 启动提供程序。

这是一个快速的 sn-p:

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_PROVIDERNETWORK_PROVIDERGPS_PROVIDER 之间的区别。
  • 虽然这很理想,但我会使用 getTime() 检查最后一个位置的时间。然后,这只是决定你允许它多大的问题。如果太旧,请使用我的帖子获得新职位。
  • @Ian 如何获取新位置?
  • gps 关闭时我们可以获取位置
【解决方案3】:

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

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

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

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

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

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

  1. 拍摄夜空照片并使用当前时间根据星图估计您的位置。这可能需要额外的设备来确保正确测量图片的角度。
  2. 使用加速度计从已知位置开始跟踪位置。这种方法中的错误累积使得它在大多数情况下不切实际。

【讨论】:

    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案5】:

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

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

      2.Click Here For Your Reference

      【讨论】:

        【解决方案6】:

        您看过 Google Maps Geolocation Api 吗? Google Map Geolocation

        这是一个简单的 RestApi,你只需要 POST 一个请求,服务就会返回一个精确到米的位置。

        【讨论】:

          【解决方案7】:

          看来不使用 GPS 也可以追踪智能手机。

          来源:

          主:"PinMe: Tracking a Smartphone User around the World"

          中学:"How to Track a Cellphone Without GPS—or Consent"

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 怎么用?
            猜你喜欢
            • 1970-01-01
            • 2013-09-11
            • 2011-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多