该网站已经迁移到:blog.xwdoor.net

Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi

android xwdoor 724℃ 0评论

Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi

有这样的需求:通过扫描二维码获取Wi-Fissid和密码,然后自动连接。我们先后出了两个版本,第一个版本,是通过网络搜索出来融合的初略版本,代码比较简陋,效果就是很多用户反馈联网的问题;第二个版本是我写的,基于充分了解联网逻辑的基础上,用kotlin实现的,效果马马虎虎,不过时不时还是有用户反馈联网的问题,大概1%左右吧;这次痛定思痛,采用反射调用系统framework的隐藏方法来实现连接wifi的功能。

因为是反射调用隐藏的方法 connect,且用到了一个隐藏的回调接口类ActionListener,所以在调用connect()方法前,需要先实现该接口,这就用到了委托、代理的原理

Note: 本文所有代码均是基于kotlin语言实现

1.实现 ActionListener 接口类

系统提供的连接wifi的方法有两个,分别是:

可以看到,两个重载方法都需要传递一个ActionListener接口参数,这个接口的源代码如下:

简单来讲,接口类ActionListener有两个回调方法,分别是成功回调onSuccess和失败回调onFailure,跟我们平时使用的网络访问回调很像,麻烦在于它是隐藏的。

第一步,使用反射和代理实现 ActionListener 接口类,代码如下:

Note: ActionListener中有两个回调方法,这个时候我们可以通过第二个参数的属性值method.name来判断回调的是哪个方法

总结一下,创建代理的步骤如下:
1. 获取接口类的类型。如果是公开的(public),就直接类::java.class就行,比如:ActionListener::class.java,如果是隐藏的,就通过反射获取。
2. 实现接口InvocationHandlerActionListener中的回调方法的代码逻辑也是在里边实现。
3. 创建代理,关联ActionListenerInvocationHandler。此时的代理可以认为是ActionListener的实现类

一语概之,先通过反射获取隐藏接口类 ActionListener,然后通过代理实现该接口

2.获取 connect 方法实现联网操作

接下来就简单了,获取隐藏方法connect()连接Wi-Fi,代码如下:

通过反射获取其中一个连接Wi-Fi的方法:public void connect(WifiConfiguration config, ActionListener listener),然后调用。需要注意的是,该方法的第一个参数是WifiConfiguration类型的,所以需要各位自己去创建了,创建过程比较麻烦,可以参考网络,我有空的话再写一篇文章,哈哈。

3.总结

好了,具体实现方法已经记录完毕,剩下的估计就是一些参数的创建,和回调方法中的具体代码逻辑了,最后,再归纳一下步骤吧:
1. 获取接口类的类型,方法:反射获取或者类::java.class
2. 继承实现接口InvocationHandler
3. 创建代理Proxy,作用是关联第一步中的接口类和第二步中的InvocationHandler
4. 反射获取隐藏方法connect()并调用

转载请注明:xwdoor » Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址