更新时间:2024-12-10 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. GPS数据注入方式
    • 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" 
    • 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

相关文档