我尝试在 Python 中获取 Android 手机的 GPS 位置(使用 QPython3 应用程序)。这种可行,但是Android中似乎有几个LocationProvider:
- gps: 纯gps定位,速度慢,耗能,但非常准确, 正是我所需要的。
- 网络: GPS和wifi/小区定位的混合,更快,但不太准确
- 被动: 像上面一样,但完全不使用gps
问题:|| |当我运行脚本(如下)时,我只能获取“网络”提供的位置 不够准确。 但我找不到强制指定特定 LocationProvider 的方法。
代码:
示例输出(假坐标):
# import needed modules
import android
import time
import sys, select, os #for loop exit
#Initiate android-module
droid = android.Android()
#notify me
droid.makeToast("fetching GPS data")
print("start gps-sensor...")
droid.startLocating()
while True:
#exit loop hook
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
line = input()
print("exit endless loop...")
break
#wait for location-event
event = droid.eventWaitFor('location',10000).result
if event['name'] == "location":
try:
#try to get gps location data
timestamp = repr(event['data']['gps']['time'])
longitude = repr(event['data']['gps']['longitude'])
latitude = repr(event['data']['gps']['latitude'])
altitude = repr(event['data']['gps']['altitude'])
speed = repr(event['data']['gps']['speed'])
accuracy = repr(event['data']['gps']['accuracy'])
loctype = "gps"
except KeyError:
#if no gps data, get the network location instead (inaccurate)
timestamp = repr(event['data']['network']['time'])
longitude = repr(event['data']['network']['longitude'])
latitude = repr(event['data']['network']['latitude'])
altitude = repr(event['data']['network']['altitude'])
speed = repr(event['data']['network']['speed'])
accuracy = repr(event['data']['network']['accuracy'])
loctype = "net"
data = loctype + ";" + timestamp + ";" + longitude + ";" + latitude + ";" + altitude + ";" + speed + ";" + accuracy
print(data) #logging
time.sleep(5) #wait for 5 seconds
print("stop gps-sensor...")
droid.stopLocating()
总结:
net;1429704519675;37.235065;-115.811117;0;0;23
net;1429704519675;37.235065;-115.811117;0;0;23
net;1429704519675;37.235065;-115.811117;0;0;23
如何获取使用Python在Android中精确的GPS位置? 提前感谢大家!
编辑:已经测试过:
内部/外部
- 启用/禁用
- 启用WiFi GPS(运行脚本之前)
- WiFi GPS enabled (before running script)
使用 QPython 安卓应用,你无法直接控制底层位置提供程序来强制使用 GPS。QPython 的
android
模块提供了一个简化的与安卓 API 交互的接口,并且没有提供选择特定位置提供程序的粒度控制。
为何会这样:
-
抽象:
QPython 及其
android
模块旨在简化安卓开发。它们抽象出底层复杂性,包括管理不同位置提供程序的复杂性。 -
限制:
android
模块的功能有限,它可能不包含访问所有精细位置设置和选项。
可能的解决方案:
-
使用 Kivy 及其 Python-for-android:
-
Kivy 是一个 Python 框架,可以更好地控制安卓 API,允许你构建具有更多自定义选项的完整安卓应用。
-
plyer 是一个 Kivy 库,提供对平台特定 API 的访问,包括位置信息。plyer 让你可以指定位置提供程序(GPS)。
```python from plyer import gps
gps.configure(on_location=self.on_location, on_status=self.on_status) gps.start(minTime=1000, minDistance=1)
def on_location(self, **kwargs): latitude = kwargs.get('latitude') longitude = kwargs.get('longitude') # ... 处理位置数据
def on_status(self, status, message): # ... 处理 GPS 状态更新 ```
-
创建安卓服务(高级):
-
你可以创建一个使用 Java 或 Kotlin 编写的自定义安卓服务,该服务以你想要的方式处理位置更新(使用 GPS 提供程序)。
- 然后,你可以从你的 Python 脚本调用此服务来获取精确的 GPS 位置。这需要安卓开发方面的专业知识。
建议:
如果需要精确的 GPS 位置并且熟悉安卓开发基础知识,请考虑使用 Kivy 和 plyer 或创建自定义安卓服务。如果需要一个更简单的解决方案并且可以接受一定的精度偏差,那么继续使用
android
模块,但要明白它的局限性。