我想假装在android中的位置。在android中,有一种使用PendingIntent
获取位置的方法。这是一个例子:
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
String proximitys = "ACTION";
IntentFilter filter = new IntentFilter(proximitys);
LocationReceiver mReceiver = new LocationReceiver();
registerReceiver(mReceiver, filter);
Intent intent = new Intent(proximitys);
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
service.requestLocationUpdates("network", 1000, 0.001f, proximityIntent);
BroadcastReceiver
会在新位置更改时收到事件:
public class LocationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Do this when the system sends the intent
Bundle b = intent.getExtras();
Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED);
}
}
所以,我想挂钩这个方法。但我不知道如何挂钩这种方法(使用PendingIntent
)。因为PendingIntent
会在"某些未来"中有数据,而我也不知道它何时会发生。因此,在方法requestLocationUpdates
之前和之后挂钩似乎都不起作用,因为当时PendingIntent
还没有任何数据。
请告诉我怎么做。
答案 0 :(得分:0)
您需要截取广播接收器,而不是挂起的意图。您可以截取LocationReceiver.onReceive
并更改意图的内容。
通过定义onReceive
来拦截beforeHookedMethod
。使用其参数(MethodHookParam params
)检索意图(params.args[1]
)并更改其附加内容(intent.replaceExtras(bundle)
)。
确保您的新捆绑包具有相同的密钥(android.location.LocationManager.KEY_LOCATION_CHANGED
)和值,您可以设置自己的位置:
Location loc = new Location("yourprovider");
loc.setLatitude(66.6);
loc.setLongitude(66.6);