在不使用GPS或互联网的情况下获取Android中用户的当前位置


91

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


1
接受的答案是否完美?对我来说这是行不通的... !!!
Samitha Chathuranga

3
不幸的是,所接受的答案是错误的:-(令人惊讶的是,即使没有正确回答问题,它也获得了28次赞成票!
David Wasser

@DavidWasser感谢您的宝贵意见。您是否认为没有使用互联网或GPS的方法实际上没有获取位置详细信息的任何方法?(而不是使用该小区广播的消息)
Samitha Chathuranga

2
@SamithaChathuranga考虑一下:如果您没有GPS且没有互联网,那么您将在哪里获得此信息?您可以从网络获取小区ID信息。这仅给您ID。然后,您需要一种将ID映射到实际坐标或名称的方法。您可以始终构建自己的小区ID数据库并将其包含在应用程序中,但是要花费大量的工作来收集所有数据,并且映射不是静态的:随着移动运营商安装新的基站并重新编号,映射会发生变化他们的网络。基本上,实际答案是“否”。
David Wasser 2015年

@DavidWasser感谢您的答复。我也很惊讶没有互联网或gps的位置。但是据说在许多论坛中都包括stackoverflow。这就是为什么我认为这将是可能的。似乎很多人也被误导了。
Samitha Chathuranga

Answers:


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()在您的活动中实现。


1
请记住检查有关电池保存的策略。另外,根据您的应用程序,如果其他应用程序正在使用天线,则PASSIVE_PROVIDER并使用getLastKnownLocation可以为您节省大量工作和电池。
伊恩

2
嘿,@ Ian,我使用了相同的代码。但是,就我而言,从未调用过onLocationChanged()侦听器方法。我在onResume()方法上使用了requestLocationUpdates。仍然从来没有打电话过。.那么那儿出了什么问题?
MS。

2
嘿@lan或任何可以帮助我的人,我在上面的代码中实现了我,但是需要调用onLocationChanged方法调用什么问题,请问任何人都可以帮助我.....
pareshm 2015年

1
是否可以在没有网络的情况下获得座标?在某些设备中,它似乎不起作用。
iammilind

20
这个答案是错误的:-( OP询问如何在不使用Internet连接的情况下获取位置。LOCATION_PROVIDER需要使用Internet访问服务器才能将一组Cell-ID和WIFI MAC地址解析为一个地理坐标。如果您没有Internet,连接,您将无法获得坐标。如果您告诉我它适用于您,则意味着您具有Internet连接,或者您具有Internet连接(位置API下载并缓存了有关您周围区域的一些信息) ,或位置信息过旧(因此不准确)
大卫·瓦瑟

16

通过获取,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" />

我在想的是,是否可以使用移动网络获取当前位置
Prabhu M

您需要阅读文档。了解之间的差异PASSIVE_PROVIDERNETWORK_PROVIDER以及GPS_PROVIDER
hwrdprkns 2011年

1
尽管这很理想,但我将使用getTime()检查最后一个位置的时间。然后,只需确定要允许多大年龄即可。如果太旧了,请使用我的帖子获得新职位。
伊恩(Ian)

1
@Ian如何获​​得新的或新的位置?
Archie.bpgc

5
如果gps关闭,我们可以找到位置吗?
Prasad 2015年

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;
    }
}

4

不,您当前无法使用GPS或互联网获取位置。

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

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

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

使用最近的位置需要您最近拥有GPS或Internet访问。如果您只有互联网,大概可以调整您的位置或设置来重新获得互联网。如果您的设备没有GPS或互联网访问权限,那么最近的已知位置功能将无济于事。

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

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

3

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

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

2. 单击此处供参考




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.