更新时间:2024-09-29 GMT+08:00
分享

修改云手机定位

功能介绍

影响手机定位功能的信息分为四类,分别为GPS经纬度数据、基站信息数据、WiFi信息及IP地址,云手机支持其中的GPS经纬度数据和WiFi信息模拟,用户可根据业务场景,选择其中一种或多种进行定位模拟。

定位模式

精度

常见场景

GPS

地图、导航等需要持续定位的应用软件

WiFi

一般用于GPS和基站的辅助定位手段

前提条件

已购买并通过ADB方式登录云手机。详细操作请参见“购买云手机服务器”。

GPS经纬度数据模拟

  1. GPS经纬度获取

    云手机GPS经纬度数据模拟基于WGS84坐标系,使用其它坐标系如GCJ02(高德、QQ地图) ,BD09(百度地图) 注入会产生偏差。

    获取GPS定位信息示例:

    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
    private final LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // location包含gps数据经纬度等信息
            }
    };
  2. shell命令注入

    在手机adb shell环境里执行echo "参数列表(参数之间用“:”分割)" > /data/gps/fifo。

    参数说明如表1所示。

    表1 GPS数据注入参数

    参数

    说明

    是否必须

    缺省值

    约束

    latitude

    纬度。

    北纬为正,南纬为负。

    必须

    22.657501

    取值范围:-90.000000~90.000000

    单位:度(°)

    longitude

    经度。

    东经为正,西经为负。

    必须

    114.055939

    取值范围:-180.000000~180.000000

    单位:度(°)

    altitude

    海拔高度

    可选

    51.0

    单位:米

    speed

    速度

    可选

    0.0

    单位:米

    bearing

    方向角。

    0°表示正北方向,90°表示正东方向,180°表示正南方向,270°表示正西方向。

    可选

    30.0

    取值范围:0.0~360.0

    单位:度(°)

    accuracy

    定位精度

    可选

    90.0

    单位:米

    举例:假设需修改的位置是东经114.055939度,北纬22.657501度。

    adb -s 127.0.0.1:本地空闲端口 shell "echo 'longitude=114.055939:latitude=22.657501' > /data/gps/fifo" 
  3. GPS数据持续注入(建议使用非阻塞注入方式)

    使用自有或第三方SDK应用代码持续注入GPS数据,需使用O_NONBLOCK非阻塞方式注入。

    举例:

    #define GPSFifoName "/data/gps/fifo"
    if((fifo_fd = open(GPSFifoName, O_WRONLY | O_NONBLOCK)) < 0) {
    ALOGE("open fifo "%s" (write) fail, error = %s\n", GPSFifoName, strerror(errno));
    return;
    }
    //注意cmd参数间需要通过冒号“:”进行分割
    char* cmd = "longitude=113.370592:latitude=23.123642";
    len = strlen(cmd);
    if(write(fifo_fd, cmd, len) != len) {
    ALOGE("%s: write "%s" to "%s" fail: %s", FUNCTION, cmd, GPSFifoName, strerror(errno));
    }

WiFi信息模拟

  1. WiFi信息获取

    获取WiFi信息示例:

    WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiConnection = wifiManager.getConnectionInfo();
    if (wifiConnection != null) {
        String bssid =  wifiConnection.getBSSID();
    }
  2. WiFi信息注入

    针对当前连接WiFi BSSID,可以通过设置属性com.cph.wifi.bssid进行注入。

    举例:

    setprop com.cph.wifi.bssid 02:00:00:00:00:00

相关文档