gpt4 book ai didi

android - 如何获取对 ConnectivityService 对象的引用?

转载 作者:搜寻专家 更新时间:2023-11-01 09:09:12 25 4
gpt4 key购买 nike

我已经尝试了所有我能想到的。我尝试调用 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 中的静态字段,它拥有一个自身的实例,但它是空的。

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,但它也是空的。

一旦我掌握了它,我想尝试使用反射对 ConnectivityService 进行额外调用以打开 radio 。

最佳答案

我知道这有点陈旧,但为了后代:

我认为您确实需要 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

关于android - 如何获取对 ConnectivityService 对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com