3

我正在开发一个带有 NFC 和 wifi direct 的应用程序。我使用 NFC 和 Wifi Direct 获取 MAC 地址来传输数据。我打电话给 discoverpeers() 并且可以获得成功。但是没有回调WIFI_P2P_PEERS_CHANGED_ACTION,只有当我进入设置并选择 wifidirect 时才会出现回调。

这在另一个问题中讨论过

我可以通过代码打开 WiFi-Direct 吗?在 Android API-14 (ICS) 上

“我想补充一点,JB 及更高版本上的 WiFi 直连(至少在 AOSP 上)并非一直处于活动状态 - 它只是看起来是。如果你查看 WiFi 直连的听众,它会在一段时间后自行关闭。但是,如果您打开 wifi 直接菜单,它会自行重新打开。您可能必须让主机进行对等搜索或初始化才能被找到。可能是一个省电技巧。我也发现它是阻塞,因为当它接受连接时,整个系统会锁定并且有时无法连接。(系统邀请)– Mgamerz“

谁能建议问题WIFI_P2P_PEERS_CHANGED_ACTION回调的解决方案没有得到,只有在手动进入设置->wifi->点击wifidirect时才能得到

我使用了两台设备 Samsung Galaxy nexus 和 nexus 7 都在 4.2.2 上运行

4

5 回答 5

4

没有可用的 API 可启用,但您可以从 android 设置 4.0.1wifiP2P调用方法“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);
于 2013-12-11T23:56:57.513 回答
1

不是来自代码。用户必须这样做。这就是演示在操作栏中有指向 wifi 设置的链接的原因。

当您调用 manager.discoverPeers(channel, new WifiP2pManager.ActionListener() 定义onFailure并查看reasonCode. 如果为 0,则 Wifi 或 WiFi direct 处于关闭状态。

如果您查看 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

于 2013-07-11T21:49:24.400 回答
1

感谢用户 3093354。要继续您的解决方案,为了禁用您必须调用的 p2p:

Method method1 = manager.getClass().getMethod("disableP2p", Channel.class);
于 2014-04-02T16:55:53.963 回答
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"/>
于 2013-06-17T08:12:09.347 回答
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 卡的。

于 2015-09-28T19:07:12.940 回答