-
Notifications
You must be signed in to change notification settings - Fork 3
/
LocationManager.java
151 lines (135 loc) · 5.88 KB
/
LocationManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.jasperhale.myprivacy.XposedHook.Hook;
import android.app.PendingIntent;
import android.location.Criteria;
import android.location.GpsStatus;
import java.util.ArrayList;
import com.jasperhale.myprivacy.XposedHook.XpModel.mXpModel;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class LocationManager {
private static final String Mark = "MyprivacyHook";
private static final String TAG = "LM";
private static final String Class = "LM";
private static final String ClassName = "android.location.LocationManager";
private static XC_LoadPackage.LoadPackageParam lpparam;
public static LocationManager get(XC_LoadPackage.LoadPackageParam lpparam) {
LocationManager.lpparam = lpparam;
return LocationManagerHolder.locationManager;
}
public static void handle() {
if (mXpModel.getLimted(lpparam.packageName, Class, "addGpsStatusListener")) {
addGpsStatusListener();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "addNmeaListener")) {
addNmeaListener();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "addProximityAlert")) {
addProximityAlert();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "getBestProvider")) {
getBestProvider();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "getLastLocation")) {
getLastLocation();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "getLastKnownLocation")) {
getLastKnownLocation();
}
if (mXpModel.getLimted(lpparam.packageName, Class, "getProviders")) {
getProviders();
}
}
private static class LocationManagerHolder {
private static final LocationManager locationManager = new LocationManager();
}
//Adds a GPS status listener.
private static void addGpsStatusListener() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "addNmeaListener");
XposedHelpers.findAndHookMethod(LocationManager.class, "addGpsStatusListener", GpsStatus.Listener.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
if (param.args[0] != null) {
XposedHelpers.callMethod(param.args[0], "onGpsStatusChanged", 1);
XposedHelpers.callMethod(param.args[0], "onGpsStatusChanged", 3);
}
}
});
}
//添加监听
private static void addNmeaListener() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "addNmeaListener");
try {
final Class<?> LocationManager;
LocationManager = XposedHelpers.findClass(ClassName, lpparam.classLoader);
XposedBridge.hookAllMethods(LocationManager, "addNmeaListener", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
param.args[0] = null;
//param.setResult(false);
}
});
} catch (NoSuchMethodError e) {
XposedBridge.log(Mark + lpparam.packageName + TAG + e.toString());
}
}
//报告有关网络状态的额外信息
private static void addProximityAlert() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "addProximityAlert");
try {
findAndHookMethod(ClassName, lpparam.classLoader, "addProximityAlert", double.class, double.class, float.class, long.class, PendingIntent.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
param.args[0] = 0;
param.args[1] = 0;
}
});
} catch (NoSuchMethodError e) {
XposedBridge.log(Mark + lpparam.packageName + TAG + e.toString());
}
}
//最好的定位提供商 指定gps
private static void getBestProvider() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "getBestProvider");
XposedHelpers.findAndHookMethod(LocationManager.class, "getBestProvider", Criteria.class, Boolean.TYPE, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
param.setResult("gps");
}
});
}
//提供商 位置
private static void getLastLocation() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "getLastLocation");
XposedHelpers.findAndHookMethod(LocationManager.class, "getLastLocation", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(null);
}
});
}
//最近一次位置
private static void getLastKnownLocation() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "getLastKnownLocation");
XposedHelpers.findAndHookMethod(LocationManager.class, "getLastKnownLocation", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
param.setResult(null);
}
});
}
//定位提供商
private static void getProviders() {
XposedBridge.log(Mark + lpparam.packageName + TAG + "getProviders");
XposedBridge.hookAllMethods(LocationManager.class, "getProviders", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("gps");
param.setResult(arrayList);
}
});
}
}