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

Pra*_*u M 89 gps android geolocation android-gps

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

Ian*_*Ian 85

你要做的是使用LocationManager.NETWORK_PROVIDER而不是取得位置LocationManager.GPS_PROVIDER.这NETWORK_PROVIDER将解决GSM或WiFi,这是永远可用的.显然,关闭wifi,将使用GSM.请记住,使用细胞网络准确到500米.

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);
Run Code Online (Sandbox Code Playgroud)

您还可以让您的活动实现LocationListener该类,从而onLocationChanged()在您的活动中实施.

  • 这个答案是错误的:-( OP询问如何在不使用Internet连接的情况下获取位置.LOCATION_PROVIDER需要使用Internet访问服务器以将Cell-ID和WIFI MAC地址的集合解析为地理坐标.如果您没有Internet连接你将无法获得坐标.如果你告诉我它适合你,这意味着你有一个互联网连接,或者你有一个互联网连接(位置API下载并缓存一些关于你周围的区域的信息) ,或位置信息是旧的(因此不准确). (18认同)
  • 嘿@Ian,我使用了相同的代码..但在我的情况下,onLocationChanged()监听器方法从未调用过.我在onResume()方法上使用了requestLocationUpdates.它仍然没有打过电话..所以那里有什么问题? (2认同)
  • 嘿@lan或任何其他可以帮助我实现上述代码的人,但onLocationChanged方法neved被称为什么问题可以任何人帮助我请..... (2认同)

hwr*_*kns 15

通过获得getLastKnownLocation你自己实际上没有启动修复.

请注意,这可能会启动提供程序,但如果用户以前曾获得过某个位置,我认为不会.文档在这方面并不是很清楚.

根据docs 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您还必须添加新权限 AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

  • 如果gps关闭,我们可以获得位置吗? (5认同)

mat*_*ttm 5

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

基于 WiFi、蜂窝或蓝牙的定位技术需要不断更新的大型数据库的帮助。设备扫描发射器 ID,然后通过互联网将这些查询发送到 Google、Apple 或 Skyhook 等服务。该服务根据先前从已知位置进行的无线调查来响应位置。如果无法访问互联网,您必须拥有此类数据库的本地副本并保持最新。对于全球使用来说,这是非常不切实际的。

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

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

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

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

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