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

我可以直接从代码打开WiFi吗?在API-16上(Android 4.2.2),android,android-4.2-jelly-bean,wifi-direct,Android,Android 4.2 Jelly Bean,Wifi Direct,我正在开发一个具有NFC和wifi direct的应用程序。我使用NFC和Wifi直接获取MAC地址以传输数据。我称之为discoverpeers(),可以获得成功。但是没有回调WIFI\u P2P\u PEERS\u CHANGED\u ACTION,只有在我转到设置并选择wifidirect时才会出现回调 这在另一个问题中讨论过 “我想在JB和更高版本上直接添加WiFi(至少在AOSP上)不是一直处于活动状态-它只是看起来处于活动状态。如果您查看WiFi direct的侦听器,它会在一段时

我正在开发一个具有NFC和wifi direct的应用程序。我使用NFC和Wifi直接获取MAC地址以传输数据。我称之为discoverpeers(),可以获得成功。但是没有回调
WIFI\u P2P\u PEERS\u CHANGED\u ACTION
,只有在我转到设置并选择wifidirect时才会出现回调

这在另一个问题中讨论过

“我想在JB和更高版本上直接添加WiFi(至少在AOSP上)不是一直处于活动状态-它只是看起来处于活动状态。如果您查看WiFi direct的侦听器,它会在一段时间后自动关闭。但是,如果您打开WiFi direct菜单,它会自动重新打开。您可能需要让主机进行对等搜索或对其进行初始化才能找到。这可能是一个节省电池的伎俩。我还发现了d表示它正在阻塞,因为当它接受连接时,整个系统将锁定,有时无法连接。(系统邀请)–Mgamerz“

是否有人可以建议问题的解决方案
WIFI\u P2P\u PEERS\u CHANGED\u ACTION
只有在手动进入设置->WIFI->点击wifidirect时才能获得回调

我使用了两台运行在4.2.2上的三星galaxy nexus和nexus 7设备

//试试看,可能会对你有所帮助
//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"/>
WifiManager WifiManager=(WifiManager)this.getSystemService(this.WIFI_服务); wifiManager.setWifiEnabled(true)//正确-启用WIFI连接。 //False-禁用WIFI连接。 //在清单文件中添加此权限:
不是来自代码。用户必须这样做。这就是为什么演示在操作栏中有指向wifi设置的链接

调用
manager.discoverPeers(频道,新的WifiP2pManager.ActionListener()
定义
onFailure
并查看
reasonCode
。如果为0,则Wifi或Wifi direct关闭

如果您查看WiFi Direct演示应用程序,
WifiDirectBroadcast接收器
,这段代码将查看是否专门启用了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();

        }

然后,当调用discover peers时,它会查看由
setIsWifiP2pEnabled

设置的变量,没有可用的API来启用
wifiP2P
,但您可以从android设置4.0.1调用方法“enablepp2p”

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);

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

Method method1 = manager.getClass().getMethod("disableP2p", Channel.class);

如果您是根用户,则可以从命令提示符加载具有所需并发级别的wifi驱动程序:

/system/bin/insmod/system/lib/modules/wlan.ko con_mode=3

这些是值:
typedef枚举
{ 
VOS_STA_模式=0,
VOS_STA_SAP_模式=1,
VOS_P2P_客户端_模式,
VOS_P2P_GO_模式,
VOS_监视器_模式,
VOS_FTM_模式=5,
VOS_IBSS_模式,
VOS_P2P_设备_模式,
VOS_最大值_模式的编号
}电视操作系统控制模式;


这是一张Atheros卡。

谢谢。但我在找wifidirect@Mgamerz我已经链接到你的帖子commented@jabaldonedo在4.2.2中,没有在设置中启用的选项。我的问题是回调WIFI\u P2P\u PEERS\u CHANGED\u仅当我转到设置选择wifidirect注意:选择不会在我的LG上打开P769(android 4.1.2),“找不到方法”。尽管管理器和频道不为空。我的手机是否支持wifi直连?