Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi
2017-12-16 10:29
1306 查看
Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi
本文转载自:http://www.xwdoor.net/android-reflection-proxy-call-system-hidden-api-method-and-interface-class-wi-fi-connection/有这样的需求:通过扫描二维码获取
Wi-Fi的
ssid和密码,然后自动连接。我们先后出了两个版本,第一个版本,是通过网络搜索出来融合的初略版本,代码比较简陋,效果就是很多用户反馈联网的问题;第二个版本是我写的,基于充分了解联网逻辑的基础上,用
kotlin实现的,效果马马虎虎,不过时不时还是有用户反馈联网的问题,大概
1%左右吧;这次痛定思痛,采用反射调用系统
framework的隐藏方法来实现连接
wifi的功能。
因为是反射调用隐藏的方法
connect,且用到了一个隐藏的回调接口类
ActionListener,所以在调用
connect()方法前,需要先实现该接口,这就用到了委托、代理的原理
Note: 本文所有代码均是基于
kotlin语言实现
1.实现 ActionListener 接口类
系统提供的连接wifi的方法有两个,分别是:
public void connect(WifiConfiguration config, ActionListener listener) public void connect(int networkId, ActionListener listener)
可以看到,两个重载方法都需要传递一个
ActionListener接口参数,这个接口的源代码如下:
/** * Interface for callback invocation on an application action * @hide */ public interface ActionListener { /** The operation succeeded */ public void onSuccess(); /** * The operation failed * @param reason The reason for failure could be one of * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} */ public void onFailure(int reason); }
简单来讲,接口类
ActionListener有两个回调方法,分别是成功回调
onSuccess和失败回调
onFailure,跟我们平时使用的网络访问回调很像,麻烦在于它是隐藏的。
第一步,使用反射和代理实现 ActionListener 接口类,代码如下:
//通过反射获取 ActionListener 类 val actionListener = Class.forName("android.net.wifi.WifiManager\$ActionListener") //实现 InvocationHandler 接口,所有的我们需要的回调方法,都是通过这个代理回调来实现的 //通过第二个参数可以判断回调的是什么方法 val invocationHandler = InvocationHandler { proxy, method, args -> Log.i("test", "代理回调: ${args.joinToString()}") //通过方法的名称判断回调的是什么方法 if (method.name == "onSuccess") { Log.i("test", "联网成功") //等待获取ip地址 Log.i("test", "wait ip address available") } else { Log.i("test", "联网失败: $args") } } //创建接口代理类,可以理解这个就是接口实现类(实现了接口 ActionListener 的类) val proxy = Proxy.newProxyInstance(app.classLoader, arrayOf(actionListener), invocationHandler)
Note:
ActionListener中有两个回调方法,这个时候我们可以通过第二个参数的属性值
method.name来判断回调的是哪个方法
总结一下,创建代理的步骤如下:
1. 获取接口类的类型。如果是公开的(public),就直接
类::java.class就行,比如:
ActionListener::class.java,如果是隐藏的,就通过反射获取。
2. 实现接口
InvocationHandler,
ActionListener中的回调方法的代码逻辑也是在里边实现。
3. 创建代理,关联
ActionListener和
InvocationHandler。此时的代理可以认为是
ActionListener的实现类
一语概之,先通过反射获取隐藏接口类
ActionListener,然后通过代理实现该接口
2.获取 connect 方法实现联网操作
接下来就简单了,获取隐藏方法connect()连接
Wi-Fi,代码如下:
//通过反射获取隐藏方法`connect()` val connectMethod = context.wifiManager.javaClass.getDeclaredMethod("connect", WifiConfiguration::class.java, actionListener) //第二个参数需要自己创建,具体的可以参考网络 connectMethod.invoke(context.wifiManager, config, proxy)
通过反射获取其中一个连接Wi-Fi的方法:
public void connect(WifiConfiguration config, ActionListener listener),然后调用。需要注意的是,该方法的第一个参数是
WifiConfiguration类型的,所以需要各位自己去创建了,创建过程比较麻烦,可以参考网络,我有空的话再写一篇文章,哈哈。
3.总结
好了,具体实现方法已经记录完毕,剩下的估计就是一些参数的创建,和回调方法中的具体代码逻辑了,最后,再归纳一下步骤吧:1. 获取接口类的类型,方法:反射获取或者
类::java.class
2. 继承实现接口
InvocationHandler
3. 创建代理
Proxy,作用是关联第一步中的接口类和第二步中的
InvocationHandler
4. 反射获取隐藏方法
connect()并调用
相关文章推荐
- Android开发launcher、setting类应用时调用Android系统隐藏api的方法
- android-实现仿系统search框的autoCompleteTextView----如何调用系统的隐藏方法
- Android开发之调用系统隐藏API
- Android 通过调用系统接口使用如 谷歌语音、百度语音、讯飞语音等语音识别对话框的方法
- Android连接wifi,调用系统API
- 高版本Android如何利用反射调用系统隐藏的远程服务拦截来电
- Android开发 调用系统隐藏API
- android 隐藏API显式调用以及内部资源使用方法
- JAVA 反射 调用系统隐藏方法
- Android开发-调用系统隐藏API
- [Android] 利用java反射调用隐藏Api
- Android - 绑定服务调用服务里面的方法,start/bind开启服务的比较,混合方式开启服务,本地服务,远程服务,系统服务,录音API
- Android-反射调用隐藏API
- 利用Java反射技术调用Android中被隐藏的API
- Android开发工具之Android Studio--调用系统隐藏方法之操作aidl文件步骤
- 利用java反射解决 Android系统方法不能调用的情况
- 采用反射调用android隐藏的api
- Android不同系统版本依然能调用到正确的API方法Demo——Service调用startForeground举例
- Android(java)学习笔记229:服务(service)之绑定服务调用服务里面的方法 (采用接口隐藏代码内部实现)
- Android 通过调用谷歌语音系统接口弹出语音识别对话框的方法 .