如何获取ConnectivityService对象的引用?

时间:2012-03-07 15:49:01

标签: android

我已经尝试了我能想到的一切。我试图调用getInstance(),但该类不在我的SDK中。

ConnectivityService cs = ConnectivityService.getInstance(this);

我尝试使用反射来完成上述操作,

Class csClass = Class.forName("com.android.server.ConnectivityService");
Method getInstanceMethod = csClass.getDeclaredMethod("getInstance", Context.class);
Object cs = getInstanceMethod.invoke(null, this); // this = Context

但它给出了一个安全例外,说我需要WRITE_SECURE_SETTINGS权限,但这些权限仅供制造商使用。

我试图通过ServiceManager获取它,但它只返回了一个android.os.BinderProxy类。

IBinder cs = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
Log.d("HelloWorld", "cs.class:"+cs.getClass());

最后,我尝试访问ConnectivityService中的静态字段,该字段包含自身的实例,但它是null。

Class csClass = Class.forName("com.android.server.ConnectivityService");
for (Field f : csClass.getDeclaredFields()) {
    f.setAccessible(true);
    if (Modifier.isStatic(f.getModifiers())) {
        Log.d("HelloWorld", "ConnectivityServiceExt."+f.getName() + ": " + f.get(null));
    }
}
Field sServiceInstanceField = csClass.getDeclaredField("sServiceInstance");
sServiceInstanceField.setAccessible(true); // private
Object cs = sServiceInstanceField.get(null); // ConnectivityService object

我甚至尝试访问ConnectivityServiceExt.sServiceInstance,但也是null。

一旦我抓住它,我想尝试使用反射在ConnectivityService上进行额外调用以打开无线电。

2 个答案:

答案 0 :(得分:3)

我知道这有点陈旧,但后人:

我认为你真的想要IConnectivityManager。普通的ConnectivityManger不会这样做。

Class<?> serviceManagerClass = Class.forName("android.os.ServiceManager");
Method getServiceMethod = serviceManagerClass.getMethod("getService", new Class[]{String.class});
IBinder serviceManager = (IBinder)getServiceMethod.invoke(null, new Object[]{Context.CONNECTIVITY_SERVICE});

// Now use pass the ServiceManager BinderProxy to the 'asInterface' method of the interface Stub inner class
Class<?> stubClass = Class.forName("android.net.IConnectivityManager$Stub");
Method asInterfaceMethod = stubClass.getMethod("asInterface", new Class[]{IBinder.class});
Object IConnectivityManager = asInterfaceMethod.invoke(null, serviceManager);

// Now call the 'setRadios' method to turn on radios
Class<?> IConnectivityManagerClass = IConnectInterface.getClass();  
Method setRadiosMethod = IConnectivityManagerClass.getMethod("setRadios",Boolean.TYPE);
Object retVal = setRadiosMethod.invoke(IConnectivityManager,new Boolean[] {new Boolean(true)});

您可能还需要获得android.permission.CHANGE_NETWORK_STATE

的权限

答案 1 :(得分:0)

我以下列方式使用ConnectivityService:

ConnectivityManager mgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);