首页 > 编程问答 >在 Python 中获取精确的 Android GPS 位置

在 Python 中获取精确的 Android GPS 位置

时间:2024-07-27 14:54:10浏览次数:14  
标签:android python gps location-provider

我尝试在 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 模块的功能有限,它可能不包含访问所有精细位置设置和选项。

可能的解决方案:

  1. 使用 Kivy 及其 Python-for-android:

  2. Kivy 是一个 Python 框架,可以更好地控制安卓 API,允许你构建具有更多自定义选项的完整安卓应用。

  3. 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 状态更新 ```

  4. 创建安卓服务(高级):

  5. 你可以创建一个使用 Java 或 Kotlin 编写的自定义安卓服务,该服务以你想要的方式处理位置更新(使用 GPS 提供程序)。

  6. 然后,你可以从你的 Python 脚本调用此服务来获取精确的 GPS 位置。这需要安卓开发方面的专业知识。

建议:

如果需要精确的 GPS 位置并且熟悉安卓开发基础知识,请考虑使用 Kivy 和 plyer 或创建自定义安卓服务。如果需要一个更简单的解决方案并且可以接受一定的精度偏差,那么继续使用 android 模块,但要明白它的局限性。

标签:android,python,gps,location-provider
From: 29797435

相关文章

  • 使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不
    我有一个简单的python脚本,我想在docker容器内运行它。它打印一行消息“Hello{name}”。python脚本使用clickCLI界面来定义收件人名称,如果我直接运行它(不使用dockerrun命令),它将如下所示:pythonhello.py-nSmithDockerbuild命令:dockerbuild.-thello:1.......
  • 标题:在 OpenSees Python 中定义具有特定卸载行为的双线性弹塑性材料
    我正在使用Python中的OpenSees,我想定义一种在负载下表现出双线性弹塑性行为的材料。但是,我需要在卸载过程中将材质返回到其原始位置,遵循准确的加载路径。在此处输入图像描述我不确定如何在OpenSees中正确实现卸载行为,我正在寻找实现这一具体材料反应的指导。......
  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......
  • 覆盖 python 应用程序时权限被拒绝
    我使用python制作了一个粗略的自动更新应用程序,并使用freeze-cx制作了exe文件。首先,该应用程序检查firebase服务器上是否有最新版本的文件可用,如果可用则下载zip文件。并且应用程序解压并覆盖文件。this_file_path=sys.executableifgetattr(sys,'frozen......
  • 【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法
    在Android系统中,通过U-Boot(通常称为uboot)来设置启动参数(如cmdline)或尝试直接将数据传递给应用层(通过系统属性property)是一个较为间接的过程,因为U-Boot主要负责硬件初始化和引导Linux内核,而Android系统属性则是由Android系统服务(如init进程和property服务)管理的。不过,我们可......
  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • Android笔试面试题AI答之控件Views(6)
    答案来着文心一言,仅供参考目录1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结2.获取View宽高的几种方法?1.在`onWindowFocusChanged`方法中获取2.使用`ViewTreeObserver.OnGlobalLayoutListener`3.使用`ViewTreeObserver.OnPreDrawListene......