我正在使用NFC和wifi直接开发应用程序。我使用NFC和Wifi Direct获取MAC地址来传输数据。我打电话给discoverpeers()并且可以获得成功。但是没有回调WIFI_P2P_PEERS_CHANGED_ACTION
,只有当我进入设置和选择wifidirect时回调才会出现。
另一个问题讨论了这个问题
Can I turn on WiFi-Direct from code? on Android API-14 (ICS)
"我想补充一点,直接在JB及以上(至少在AOSP上)的WiFi一直不活跃 - 它似乎只是。如果你直接看看WiFi的听众,它会在一段时间后自动关闭。但是,如果打开wifi直接菜单,它会重新打开。您可能必须让主机进行对等搜索或初始化自身才能找到。可能是节省电池的伎俩。我还发现它阻塞,因为它接受连接,整个系统将锁定并且有时无法连接。 (系统邀请) - Mgamerz"
任何人都可以建议问题的解决方案WIFI_P2P_PEERS_CHANGED_ACTION
没有得到回调,只有在手动转到设置时才能获得 - > wifi->点击wifidirect
我使用了两个设备Samsung galaxy nexus和nexus 7都在4.2.2上运行
答案 0 :(得分:4)
没有可用的API启用wifiP2P
,但您可以从android设置4.0.1调用方法“enableP2p”
WifiP2pManager manager = (WifiP2pManager) getActivity().getSystemService(Context.WIFI_P2P_SERVICE);
Channel channel = manager.initialize(getActivity(), getActivity().getMainLooper(), null);
try {
Method method1 = manager.getClass().getMethod("enableP2p", Channel.class);
method1.invoke(manager, channel);
//Toast.makeText(getActivity(), "method found",
// Toast.LENGTH_SHORT).show();
} catch (Exception e) {
//Toast.makeText(getActivity(), "method did not found",
// Toast.LENGTH_SHORT).show();
}
要禁用wifiP2P
,请使用此方法
Method method1 = manager.getClass().getMethod("disableP2p", Channel.class);
答案 1 :(得分:1)
不是来自代码。用户必须。这就是为什么演示在操作栏中有wifi设置的链接。
致电manager.discoverPeers(channel, new WifiP2pManager.ActionListener()
时
定义onFailure
并查看reasonCode
。如果它为0,则Wifi或WiFi直接关闭。
如果您查看WiFi Direct演示应用程序WifiDirectBroadcast Reciever
,这段代码会查看是否已启用p2p
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
// UI update to indicate wifi p2p status.
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
// Wifi Direct mode is enabled
activity.setIsWifiP2pEnabled(true);
} else {
activity.setIsWifiP2pEnabled(false);
activity.resetData();
}
然后,当调用发现对等体时,它会查看由setIsWifiP2pEnabled
答案 2 :(得分:1)
感谢user3093354。继续使用您的解决方案,以便禁用您必须调用的p2p:
Method method1 = manager.getClass().getMethod("disableP2p", Channel.class);
答案 3 :(得分:0)
//Try this it may be help you
WifiManager wifiManager = (WifiManager)this.getSystemService(this.WIFI_SERVICE);
wifiManager.setWifiEnabled(true); //True - to enable WIFI connectivity .
//False -disable WIFI connectivity.
//add this permissions in Manifest file :
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
答案 4 :(得分:0)
如果您是root用户,可以从命令提示符加载具有所需并发级别的wifi驱动程序:
/ system / bin / insmod /system/lib/modules/wlan.ko con_mode = 3
这些是值:
typedef enum
{
VOS_STA_MODE=0,
VOS_STA_SAP_MODE=1,
VOS_P2P_CLIENT_MODE,
VOS_P2P_GO_MODE,
VOS_MONITOR_MODE,
VOS_FTM_MODE = 5,
VOS_IBSS_MODE,
VOS_P2P_DEVICE_MODE,
VOS_MAX_NO_OF_MODE
} tVOS_CON_MODE;
这是Atheros卡。