首页 > 解决方案 > 在没有 Wifi 或 SIM 的情况下使用 HERE 定位

问题描述

我已经设置了一个简单的应用程序来从 HERE 获取位置(在 HERE 开发人员支持的帮助下)这个问题在这里得到了回答

此代码在我的手机上运行良好,可以在我的日志中每分钟生成一次 GeoPosition。

我现在正试图在我的目标平板电脑上运行此代码。平板电脑很旧(运行 Android 5.1),没有 GPS,也没有 SIM 卡或手机连接。唯一可能的定位方法是使用 Wifi。我已经在平板电脑上测试了 HERE 测试应用程序,它根据 Wifi 连接找到了一个很好的大致位置 - 这就是我想要复制的内容。

当我尝试使用 GPS 的 LocationMethod 或 GPS_NETWORK 或 NETWORK 初始化 PositionManager 时,我得到了同样的错误

对于这些行:

    PositioningManager pm = PositioningManager.getInstance();
    PositioningManager.LocationStatus  ls = pm.getLocationStatus(PositioningManager.LocationMethod.GPS);
    Log.i("Position", "Setting up positioning");
    if (ls ==  PositioningManager.LocationStatus.AVAILABLE) {
        Log.i("Position", "Positioning is available");
    } else {
        Log.w("Position", "Positioning not available right now: " + ls.toString());
    }
    boolean ret = pm.start(PositioningManager.LocationMethod.GPS);
    Log.i("Position", "Positioning start returns " + ret);

我得到这些日志:

01-27 06:00:21.656 16636-16636/? I/Position: Setting up positioning
01-27 06:00:21.657 16636-16636/? W/Position: Positioning not available right now: OUT_OF_SERVICE
01-27 06:00:21.660 16636-16636/? W/System.err: java.lang.IllegalArgumentException: provider doesn't exist: network
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.os.Parcel.readException(Parcel.java:1550)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.os.Parcel.readException(Parcel.java:1499)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:582)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:899)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:500)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.here.android.mpa.internal.v.a(DeviceLocation.java:117)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.here.android.mpa.internal.ea.a(PositioningManagerImpl.java:224)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.here.android.mpa.common.PositioningManager.start(PositioningManager.java:153)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.company.app.MainActivity.setUpPositioning(MainActivity.java:63)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.company.app.MainActivity.onRequestPermissionsResult(MainActivity.java:137)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.company.app.MainActivity.checkPermissions(MainActivity.java:108)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.company.app.MainActivity.onCreate(MainActivity.java:39)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.Activity.performCreate(Activity.java:5990)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.os.Looper.loop(Looper.java:135)
01-27 06:00:21.661 16636-16636/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5258)
01-27 06:00:21.661 16636-16636/? W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
01-27 06:00:21.661 16636-16636/? W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
01-27 06:00:21.661 16636-16636/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
01-27 06:00:21.666 16636-16636/? I/Position: Positioning start returns true

每分钟我都会检查位置

            GeoPosition pos = PositioningManager.getInstance().getPosition();

它是空的。如果我将 LocationMethod 设置为 NULL,我不会得到异常,但我仍然没有得到任何 GeoPosition。

HERE 如何在他们的测试应用程序中管理它,以仅从 Wifi 获得位置?

标签: androidhere-api

解决方案


假设被引用的测试应用程序是 github 中可用的应用程序 ( https://github.com/heremaps/here-android-sdk-examples/tree/master/positioning ),建议使用 LocationDataSourceHERE 并使用 GPS_NETWORK_INDOOR启动定位模式。

mHereLocation = LocationDataSourceHERE.getInstance( new StatusListener() {
// implement the callbacks 
..
});
mPositioningManager.setDataSource(mHereLocation);
..
// start position updates, accepting GPS, network or indoor positions
if (mPositioningManager.start(PositioningManager.LocationMethod.GPS_NETWORK_INDOOR)) {
     // positioning started sucessfully
} else {
      T// error                        
} 

如果您还想通过室内无线电地图使用室内定位功能,可能需要一些特殊权限(文档


推荐阅读