android - 在没有 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 获得位置?
解决方案
假设被引用的测试应用程序是 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
}
如果您还想通过室内无线电地图使用室内定位功能,可能需要一些特殊权限(文档)
推荐阅读
- sql - 如何在 Postgres 中自动创建对 CREATE 的评论?
- vue.js - 无法在 vue 3 组合 API 中的组件上使用模板引用
- postman - 即使通过firebase提供文件,邮递员也没有上传文件
- python - 使用 pandas 找不到 Google Colaboratory 文件
- reactjs - 使用 map() 在 react-native 中处理复选框
- numpy - dask.array.from_array(np.random.random) 和 dask.array.random.random 有什么区别
- javascript - 不能分配超过 1 个获胜者
- asp.net-core-mvc - Asp.net-core api 响应 WaitingForActivision
- json - 我正在将 json 文件中的数据添加到我的列表中,但列表为空
- json - 在不使用 jq 的情况下在 bashscript 中查找/替换/附加 JSON 字符串