如何在没有 GPS 的情况下连续获取用户位置

Posted

技术标签:

【中文标题】如何在没有 GPS 的情况下连续获取用户位置【英文标题】:How to get user location continuosly without GPS 【发布时间】:2015-05-16 15:36:28 【问题描述】:

关于这个问题有一些问题,但我找不到任何没有问题的方法。我用 GPS 提供商实现了项目的版本,现在我想实现一个版本,它可以在没有 GPS 的情况下找到用户的位置,只需使用网络提供商(如 Wifi)。我试过了,但它不起作用(我无法以任何方式收到“完成”消息):

public class MapsActivity extends FragmentActivity 

    double latitude;
    double longitude;

    LocationManager locationManager;
    android.location.LocationListener networkLocationListener;
    Location location;

    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        networkLocationListener = new android.location.LocationListener() 
            public void onLocationChanged(Location location) 

                latitude = location.getLatitude();
                longitude = location.getLongitude();

                Log.d("->", "done.");

            

            public void onStatusChanged(String provider, int status, Bundle extras) 

            public void onProviderEnabled(String provider) 

            public void onProviderDisabled(String provider) 
        ;

        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener);

    

...

另外,这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.doruk.myapplication">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!--
 The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but are recommended.
    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/orange"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".ConnectionChangeReceiver"
            android:label="NetworkConnection">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

你能看出问题吗?你现在有什么建议?有没有更好的办法?

【问题讨论】:

【参考方案1】:

多鲁坎·阿尔斯兰 - 您可以使用 GoogleclientAPi,因为 locationmanager 已经 已弃用 - 使用 FusedLocationAPi 它会自动发现提供者以找到位置。 - https://developer.android.com/google/auth/api-client.html 看看 在这 - 这是一个例子protected void createLocationRequest() LocationRequest mLocation = LocationRequest.create(); GoogleAPiClient mgoogle; /*在这里输入代码 * Set the update interval */ mLocation.setSmallestDisplacement(500); // 2km mLocation.setInterval(180000);// 3 min mLocationRequest.setFastestInterval(120000);// 2 min mLocation.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); if (mgoogle == null) mgoogle = new GoogleApiClient.Builder(this) .addApi(LocationServices.API).addConnectionCallbacks(this) .addOnConnectionFailedListener(this).build(); mgoogle.connect();

这是一个示例并实现 OnConnectionFailedListener, ConnectionCallbacks, com.google.android.gms.location.LocationListener 以上3个接口可以获取连续的Location。 getLastLocation LocationRequest 类的方法将为您提供位置。 onLocationChanged 方法将为您提供所需的输出。

【讨论】:

信息丰富的答案,但这不是我想要的。我需要找到一种在没有 GPS 的情况下获取位置的方法,因此间接地没有位置服务。我只需要使用 Wifi 连接来获取位置。例如,如果您检查了 Yandex 地图,当您关闭定位服务但保持打开 Wifi 时,它会继续获取您当前的位置并将其显示在地图上。考虑两种获取位置的方法:1. 位置服务,2. Wifi。 Yandex Maps 仅适用于 1 或 2,并且适用于 1 和 2,但我当前的应用程序适用于 1,并且存在 1 和 2,也应该仅适用于 2。 @DorukhanArslan link 你在问这样的问题吗? 您的答案和此链接中给出的答案都必须严格使用位置服务,这会过度消耗电池。我用华硕 Zenphone 测试我的应用程序,这款手机没有 GPS 选项卡。即,它在打开位置服务选项时触发 GPS。我已经编写但没有放在这里的代码是您建议的技术的完整版本。我提出的问题代码与您在此链接中提供的代码相同。不幸的是,它们都依赖于位置服务的存在。当且仅当 Wifi 连接处于活动状态时,我才需要获取位置。 顺便说一句,我可能表达不清楚。我只想在 GPS、定位服务和其他东西关闭但 Wifi 连接打开时获取位置。到目前为止,我找不到任何方法来做到这一点。如果你愿意,我也可以把整个项目放在这个问题上。 不需要我也找到你的答案我会尽快回复我得到答案【参考方案2】:

您可以使用用户的 IP 地址来获取大致位置。

【讨论】:

以上是关于如何在没有 GPS 的情况下连续获取用户位置的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个按钮,该按钮将在没有侦听器的情况下获取用户的位置

如何在不使用 GPS 的情况下获取 Android 设备的当前城市名称?

在没有互联网的情况下使用 iPhone GPS 更新用户位置

如何忽略 android 中的 irelevent gps 位置更新?

在没有互联网的情况下使用 Javascript 获取 GPS 位置 [重复]

如何在启用 MyLocation 的情况下使用 moveCamera 时忽略 GPS 位置更改