我有两个使用WiFi Direct的Android设备。在一个设备上,我可以使用WifiP2pManager
类获取有关另一个设备的信息,并请求连接到另一个设备。但是当我请求连接时,另一台设备会弹出一个小窗口询问用户是否想要接受连接请求。
是否可能自动接受这些连接请求?也就是说,能否在没有用户确认的情况下连接到另一个设备?
我有两个使用WiFi Direct的Android设备。在一个设备上,我可以使用WifiP2pManager
类获取有关另一个设备的信息,并请求连接到另一个设备。但是当我请求连接时,另一台设备会弹出一个小窗口询问用户是否想要接受连接请求。
是否可能自动接受这些连接请求?也就是说,能否在没有用户确认的情况下连接到另一个设备?
借助Xposed框架,可以轻松完成。您只需要替换Android Java类中的单个方法(请参见snihalani答案中的链接)。但是,当然要使用Xposed,您的设备必须已经取得了root权限。以下代码(使用Xposed)可以表达主要思想。
@Override
public void handleLoadPackage(LoadPackageParam lpparam) {
try {
Class<?> wifiP2pService = Class.forName("android.net.wifi.p2p.WifiP2pService", false, lpparam.classLoader);
for (Class<?> c : wifiP2pService.getDeclaredClasses()) {
//XposedBridge.log("inner class " + c.getSimpleName());
if ("P2pStateMachine".equals(c.getSimpleName())) {
XposedBridge.log("Class " + c.getName() + " found");
Method notifyInvitationReceived = c.getDeclaredMethod("notifyInvitationReceived");
final Method sendMessage = c.getMethod("sendMessage", int.class);
XposedBridge.hookMethod(notifyInvitationReceived, new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
final int PEER_CONNECTION_USER_ACCEPT = 0x00023000 + 2;
sendMessage.invoke(param.thisObject, PEER_CONNECTION_USER_ACCEPT);
return null;
}
});
break;
}
}
} catch (Throwable t) {
XposedBridge.log(t);
}
}
我在SGS4的原装4.2.2 ROM上测试过,它可以正常工作。 我猜在Android中也可以通过Substrate的帮助下实现。
如果您可以修改框架,可以忽略接受窗口并直接发送“PEER_CONNECTION_USER_ACCEPT”。
基于Android 5.0,“frameworks/opt/net/wifi/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java”。
您必须找到“notifyInvitationReceived”,并进行修改...
private void notifyInvitationReceived() {
/*Direct sends the accept message.*/
sendMessage(PEER_CONNECTION_USER_ACCEPT);
/*
... old code
*/
}