我可以从代码打开WiFi-Direct吗?在API-16上(Android 4.2.2)

时间:2013-06-17 08:05:33

标签: android android-4.2-jelly-bean wifi-direct

我正在使用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上运行

5 个答案:

答案 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卡。