我已经尝试了我能想到的一切。我试图调用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上进行额外调用以打开无线电。
答案 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);