提交 fbe146c0 编写于 作者: C changzuozhen

GpsStatus mock

上级 ef3f64f2
package com.didichuxing.doraemonkit.aop.location;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.util.SparseArray;
import com.didichuxing.doraemonkit.kit.gpsmock.GpsMockManager;
import java.lang.reflect.Field;
/**
* ================================================
* 作 者:jint(金台)
......@@ -23,8 +27,37 @@ public class GpsStatusUtil {
public static GpsStatus wrap(GpsStatus status) {
if (GpsMockManager.getInstance().isMocking()) {
//在这里对GpsStatus进行修改
modifyGpsStatus(status);
return status;
}
return status;
}
public static void modifyGpsStatus(GpsStatus gpsStatus) {
try {
Class<GpsStatus> gpsStatusCls = (Class<GpsStatus>) gpsStatus.getClass();
Field mSatellitesField = gpsStatusCls.getField("mSatellites");
mSatellitesField.setAccessible(true);
SparseArray<GpsSatellite> mSatellites = new SparseArray<>();
Class<? extends GpsSatellite> satliteClass = (Class<? extends GpsSatellite>) Class.forName("android.location.GpsSatellite");
GpsSatellite satellite = satliteClass.newInstance();
Field mUsedInFixField = satliteClass.getField("mUsedInFix");
mUsedInFixField.setAccessible(true);
mUsedInFixField.set(satellite, true);
Field mPrnField = satliteClass.getField("mPrn");
mPrnField.setAccessible(true);
mPrnField.setInt(satellite, -5);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellitesField.set(gpsStatus, mSatellites);
} catch (Exception e) {
e.printStackTrace();
}
}
}
......@@ -2,7 +2,6 @@ package com.didichuxing.doraemonkit.kit.gpsmock;
import android.content.Context;
import android.location.GnssStatus;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
......@@ -13,10 +12,10 @@ import android.os.IBinder;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import androidx.annotation.RequiresApi;
import com.didichuxing.doraemonkit.aop.location.GpsStatusUtil;
import com.didichuxing.doraemonkit.util.ReflectUtils;
import java.lang.reflect.Field;
......@@ -160,40 +159,12 @@ public class LocationHooker extends BaseServiceHooker {
return gpsStatus;
}
if (gpsStatus instanceof GpsStatus) {
mockGpsStatus((GpsStatus) gpsStatus);
GpsStatusUtil.modifyGpsStatus((GpsStatus) gpsStatus);
}
return gpsStatus;
}
}
public static void mockGpsStatus(GpsStatus gpsStatus) {
try {
Class<GpsStatus> gpsStatusCls = (Class<GpsStatus>) gpsStatus.getClass();
Field mSatellitesField = gpsStatusCls.getField("mSatellites");
mSatellitesField.setAccessible(true);
SparseArray<GpsSatellite> mSatellites = new SparseArray<>();
Class<? extends GpsSatellite> satliteClass = (Class<? extends GpsSatellite>) Class.forName("android.location.GpsSatellite");
GpsSatellite satellite = satliteClass.newInstance();
Field mUsedInFixField = satliteClass.getField("mUsedInFix");
mUsedInFixField.setAccessible(true);
mUsedInFixField.set(satellite, true);
Field mPrnField = satliteClass.getField("mPrn");
mPrnField.setAccessible(true);
mPrnField.setInt(satellite, -5);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellites.append(0, satellite);
mSatellitesField.set(gpsStatus, mSatellites);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* LocationListener代理
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册