Xposed:如何挂钩使用PendingIntent的方法

时间:2016-10-29 17:25:38

标签: android location android-pendingintent xposed

我想假装在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还没有任何数据。

请告诉我怎么做。

1 个答案:

答案 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);