定位
需提前开启权限
AS程序: 开发者 -> 定位 -> 权限申请
小程序: 关于 -> 定位 -> 权限申请
# 包
from ascript.android import location
获取GPS位置信息
监听GPS位置刷新
- 函数
location.request(call_back,min_time_updata=5000, min_distance_change=0)
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| call_back | fun python函数,带一个形参 | 是 | 如果GPS位置刷新了,会回调该函数,并传入一个android.location.Location,通过该类,我们就可以获取到经纬度等信息. |
| min_time_updata | int | 否 | GPS变化,最小更新时间,单位毫秒,默认5000毫秒. |
| min_distance_change | int | 否 | GPS最小变化距离,单位米, 默认0,不限距离变化 |
# 异步监听GSP信息,如果有GPS变化,回调该函数
from ascript.android import location
print("Hello AS!")
# 异步监听GSP信息,如果有GPS变化,回调该函数
def on_get(lo):
print("有新的gps信息",lo)
print("经度:",lo.getLatitude())
print("纬度:",lo.getLongitude())
location.request(on_get)
关闭GPS监听
- 函数
from ascript.android import location
location.close()
获取最后一次GPS位置
- 函数
location.get_last()
-
参数 无
-
返回值
android.location.Location,通过该类,我们就可以获取到经纬度等信息.
# 异步监听GSP信息,如果有GPS变化,回调该函数
from ascript.android import location
lo = location.get_last()
# 有可能获取不到,因此判断下是否为None~
if lo:
print("经度:",lo.getLatitude())
print("纬度:",lo.getLongitude())
location.request(on_get)
模拟定位
模拟定位用于把本机系统定位临时改成脚本设置的坐标。使用前需要先在 Android 开发者选项里选择 AScript 作为“模拟位置信息应用”。
使用前准备
- 打开开发者选项。
- 找到“选择模拟位置信息应用”。
- 选择 AScript。
如果没有选择 AScript, 调用模拟定位 API 会返回失败信息, 或系统不会采用脚本设置的位置。
百度坐标采集
可以使用百度地图坐标拾取工具采集坐标:
https://lbsyun.baidu.com/maptool/getpoint
百度工具采集到的是 BD-09 坐标。location.mock.start() 默认 coord_type="bd09", 会在内部自动转换为 Android 系统使用的 WGS84 坐标。
查看模拟定位状态
- 函数
location.mock.status()
- 返回值
返回 dict。
| 字段 | 类型 | 备注 |
|---|---|---|
| ok | bool | 本次状态读取是否成功。 |
| error | str | 错误信息。成功时通常为空字符串。 |
| selected | bool | 当前 AScript 是否已被系统选为“模拟位置信息应用”。如果为 False, 需要先到开发者选项里选择 AScript。 |
| running | bool | 是否正在持续上报模拟定位。调用 location.mock.start() 成功后通常为 True; 调用 location.mock.stop() 后为 False。 |
| package | str | 当前应用包名。 |
| lat | float | 当前写入系统的纬度, 坐标系为 WGS84。 |
| lon | float | 当前写入系统的经度, 坐标系为 WGS84。 |
| accuracy | float | 当前定位精度, 单位米。 |
| interval_ms | int | 持续上报间隔, 单位毫秒。 |
| updated_at | int | 最近一次写入系统定位的时间戳, 单位毫秒。 |
| providers | str | 当前写入的 provider, 通常为 gps,network。 |
| hint | str | 操作提示。未选择模拟位置信息应用时会返回提示。 |
- 返回示例
{
"ok": True,
"error": "",
"selected": True,
"running": True,
"package": "com.aojoy.airscript",
"lat": 32.06037329164692,
"lon": 118.79081508380428,
"accuracy": 5.0,
"interval_ms": 1000,
"updated_at": 1783414871763,
"providers": "gps,network"
}
- 示例
from ascript.android import location
print(location.mock.status())
启动持续模拟定位
- 函数
location.mock.start(lon, lat, accuracy=5.0, interval=1000, coord_type="bd09")
- 参数
| 参数 | 类型 | 必须 | 备注 |
|---|---|---|---|
| lon | float | 是 | 经度。默认按百度 BD-09 坐标接收。 |
| lat | float | 是 | 纬度。默认按百度 BD-09 坐标接收。 |
| accuracy | float | 否 | 定位精度, 单位米, 默认 5.0。 |
| interval | int | 否 | 持续上报间隔, 单位毫秒, 默认 1000。 |
| coord_type | str | 否 | 输入坐标系, 支持 bd09、gcj02、wgs84, 默认 bd09。 |
- 返回值
返回 dict, 包含是否成功、当前系统写入坐标、精度、状态等信息。
- 示例
from ascript.android import location
import time
# 百度坐标拾取工具采集到的坐标, 默认 coord_type="bd09"
print(location.mock.start(118.802422, 32.064652))
# 保持脚本运行, 持续上报模拟定位
time.sleep(300)
多次调用 location.mock.start() 会覆盖上一次坐标, 并重启持续上报任务。
停止模拟定位
- 函数
location.mock.stop()
stop() 会停止持续上报, 并移除 GPS / network 测试 provider。
from ascript.android import location
print(location.mock.stop())
自动释放
如果脚本结束时忘记调用 location.mock.stop(), AScript 会在小程序停止、:py 服务断开时自动释放模拟定位。