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

在不使用GPS或互联网的情况下获取Android中用户的当前位置,android,geolocation,gps,android-gps,Android,Geolocation,Gps,Android Gps,是否可以在不使用GPS或互联网的情况下获取用户的当前位置?我的意思是,在移动网络提供商的帮助下。通过获得许可,您实际上不会自己启动修复程序 请注意,这可能会启动提供商,但如果用户以前获得过位置,我认为不会。文件对此不是很清楚 根据文件GetLastKnown位置: 返回一个位置,该位置指示来自最后一个已知位置的数据 从给定提供程序获取的修复程序。这是可以做到的 正在启动提供程序 下面是一个简短的片段: import android.content.Context; import android.

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

通过获得许可,您实际上不会自己启动修复程序

请注意,这可能会启动提供商,但如果用户以前获得过位置,我认为不会。文件对此不是很清楚

根据文件GetLastKnown位置:

返回一个位置,该位置指示来自最后一个已知位置的数据 从给定提供程序获取的修复程序。这是可以做到的 正在启动提供程序

下面是一个简短的片段:

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

您要做的是使用
LocationManager.NETWORK\u PROVIDER
而不是
LocationManager.GPS\u PROVIDER
获取职位。
网络\u提供商将在GSM或wifi上进行解析,而GSM或wifi随时可用。显然,关闭wifi后,将使用GSM。请记住,使用蜂窝网络基本上可以精确到500米

有一些非常好的信息和示例代码

完成
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()

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

一,<代码>使用“http://www.google.com/glm/mmap“


2.

你看过谷歌地图地理定位Api吗


这很简单,您只需发布一个请求,服务将返回一个以米为单位的精确位置。

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

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;
    }
}
基于WiFi、蜂窝或蓝牙的定位技术借助于不断更新的大型数据库。设备扫描发送器ID,然后通过互联网以查询方式将这些ID发送给谷歌、苹果或Skyhook等服务机构。该服务根据已知位置的先前无线调查,以一个位置作为响应。如果没有互联网接入,您必须拥有这样一个数据库的本地副本,并使其保持最新。对于全球使用,这是非常不切实际的

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

简而言之,使用LocationManager.NETWORK\u提供商或android.hardware.location.NETWORK获取位置需要使用互联网。

使用最后一个已知位置需要您最近有GPS或互联网接入。如果你刚刚上网,想必你可以调整你的位置或设置再次上网。如果您的设备没有GPS或互联网接入,则最后一个已知的位置功能将无法帮助您

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

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

    资料来源:

    主要:

    中学:


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

    您可以使用TelephonyManager来完成

    我想的是,是否有可能使用移动网络获取当前位置您需要阅读文档。了解
    PASSIVE\u PROVIDER
    NETWORK\u PROVIDER
    GPS\u PROVIDER
    之间的区别。虽然这很理想,但我会使用getTime()检查最后一个位置的时间。然后,这只是一个决定你将允许这个年龄的问题。如果位置太旧,请使用“我的帖子”获取新位置。@Ian如何获取新位置或新位置?如果gps关闭,我们能否获取位置请记住查看电池保护策略。此外,根据您的应用程序,如果其他应用程序正在使用天线,被动_提供程序和使用getLastKnownLocation可能会为您节省大量工作和电池。嘿@Ian,我使用了相同的代码。。但在我的例子中,onLocationChanged()侦听器方法从未调用。我在onResume()方法上使用了RequestLocationUpdate。但它从未打过电话。。那么问题出在哪里呢?嘿@lan或任何其他人可以帮我解决我实现了上面的代码,但只调用了onLocationChanged方法neved。有什么问题吗?任何人都可以帮我解决吗……没有互联网,能得到坐标吗?在某些设备中,它似乎不起作用。这个答案是错误的:-(OP询问如何在不使用互联网连接的情况下获取位置。位置提供商需要使用互联网访问服务器,将手机ID和WIFI MAC地址的集合解析为地理坐标。如果没有互联网连接,您将无法获取坐标。如果您告诉我它对您有效,则意味着您您有Internet连接,或者您有Internet连接(location API下载并缓存有关您周围地区的一些信息),或者位置信息很旧(因此不准确)。接受的答案工作正常吗?对我来说,它不工作…!!!不幸的是,接受的答案是错误的:-(令人惊讶的是,尽管它没有正确回答问题,却获得了28张选票!@DavidWasser感谢你的支持
    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;
        }
    }