实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.vn.py; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Handler; import android.os.ResultReceiver; import android.support.annotation.RequiresApi; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.Toast; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "WifiAp8.0_MainActivity"; private RelativeLayout mLayout; private Button mBtnStart,mBtnStop; private WifiManager mWifiManager; private ConnectivityManager mConnectivityManager; public static final int WIFI_AP_STATE_DISABLING = 10; public static final int WIFI_AP_STATE_DISABLED = 11; public static final int WIFI_AP_STATE_ENABLING = 12; public static final int WIFI_AP_STATE_ENABLED = 13; public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED"; public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; private WifiApReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLayout = (RelativeLayout) findViewById(R.id.relative_layout); mBtnStart = (Button) findViewById(R.id.btn_start); mBtnStart.setOnClickListener(this); mBtnStop = (Button) findViewById(R.id.btn_stop); mBtnStop.setOnClickListener(this); mReceiver = new WifiApReceiver(); IntentFilter filter = new IntentFilter(WIFI_AP_STATE_CHANGED_ACTION); registerReceiver(mReceiver, filter); mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); mConnectivityManager = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); } public void setWifiApEnabledForAndroid(){ ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Field iConnMgrField; try{ iConnMgrField = connManager.getClass().getDeclaredField("mService"); iConnMgrField.setAccessible(true); Object iConnMgr = iConnMgrField.get(connManager); Class<?> iConnMgrClass = Class.forName(iConnMgr.getClass().getName()); Method startTethering = iConnMgrClass.getMethod("startTethering",int.class, ResultReceiver.class,boolean.class); startTethering.invoke(iConnMgr,0,null,true); Toast.makeText(getApplicationContext(),"热点创建成功",Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); } } WifiConfiguration currentConfig; WifiManager.LocalOnlyHotspotReservation hotspotReservation; @RequiresApi(api = Build.VERSION_CODES.O) public void turnOnHotspot() { mWifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() { @Override public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) { super.onStarted(reservation); hotspotReservation = reservation; currentConfig = hotspotReservation.getWifiConfiguration(); Log.v("DANG", "THE PASSWORD IS: " currentConfig.preSharedKey " \n SSID is : " currentConfig.SSID); hotspotDetaisDialog(); } @Override public void onStopped() { super.onStopped(); Log.v("DANG", "Local Hotspot Stopped"); } @Override public void onFailed(int reason) { super.onFailed(reason); Log.v("DANG", "Local Hotspot failed to start"); } }, new Handler()); } private void hotspotDetaisDialog() { Log.v(TAG, "TEST" " " currentConfig.SSID "\n" "123456789" " " currentConfig.preSharedKey); } private void startTethering() { mConnectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); if (mWifiManager != null) { int wifiState = mWifiManager.getWifiState(); boolean isWifiEnabled = ((wifiState == WifiManager.WIFI_STATE_ENABLED) || (wifiState == WifiManager.WIFI_STATE_ENABLING)); // if (isWifiEnabled) // mWifiManager.setWifiEnabled(false); // } if (mConnectivityManager != null) { try { Field internalConnectivityManagerField = ConnectivityManager.class.getDeclaredField("mService"); internalConnectivityManagerField.setAccessible(true); WifiConfiguration apConfig = new WifiConfiguration(); apConfig.SSID = "cuieney"; apConfig.preSharedKey = "12121212"; StringBuffer sb = new StringBuffer(); Class internalConnectivityManagerClass = Class.forName("android.net.IConnectivityManager"); ResultReceiver dummyResultReceiver = new ResultReceiver(null); try { WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); Method mMethod = wifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class); mMethod.invoke(wifiManager, apConfig); Method startTetheringMethod = internalConnectivityManagerClass.getDeclaredMethod("startTethering", int.class, ResultReceiver.class, boolean.class); startTetheringMethod.invoke(internalConnectivityManagerClass, 0, dummyResultReceiver, true); } catch (NoSuchMethodException e) { Method startTetheringMethod = internalConnectivityManagerClass.getDeclaredMethod("startTethering", int.class, ResultReceiver.class, boolean.class, String.class); startTetheringMethod.invoke(internalConnectivityManagerClass, 0, dummyResultReceiver, false, getApplicationContext().getPackageName()); } catch (InvocationTargetException e) { sb.append(11 (e.getMessage())); e.printStackTrace(); } finally { // log.setText(sb.toString()); } } catch (Exception e) { Log.e("WifiApManager.startTethering", Log.getStackTraceString(e)); } } } } public void setWifiApEnabledForAndroid_O(){ ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Field iConnMgrField; try{ WifiConfiguration config = new WifiConfiguration(); config.SSID = "TEST"; config.preSharedKey= "123456789"; iConnMgrField = connManager.getClass().getDeclaredField("mService"); iConnMgrField.setAccessible(true); Object iConnMgr = iConnMgrField.get(connManager); Class<?> iConnMgrClass = Class.forName(iConnMgr.getClass().getName()); Method startTethering = iConnMgrClass.getMethod("startTethering",int.class,ResultReceiver.class,boolean.class); startTethering.invoke(iConnMgr,0,null,true); Toast.makeText(getApplicationContext(),"热点创建成功",Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); } } public void setWifi(){ WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() { /* *这里是成功开启wifi后回调的方法,此处的reservation中可以通过.getWifiConfiguration().获取 *到WifiConfiguration,同样的,在WifiConfiguration中可以获取到开启热点的SSID和preSharedKey, *此方法开启的热点的名称和密码是系统随机生产的,无法自定义名称和密码,至少我到目前为止 没有找到可用于设置8.0名称和密码的方法哈哈哈。 */ @Override public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) { super.onStarted(reservation); String SSID = reservation.getWifiConfiguration().SSID; String preSharedKey = reservation.getWifiConfiguration().preSharedKey; Log.d(TAG, "onStarted: 11--11:" SSID); Log.d(TAG, "onStarted: 22--22:" preSharedKey); } @Override public void onStopped() { super.onStopped(); } @Override public void onFailed(int reason) { super.onFailed(reason); } }, null); } private WifiManager wifiManager; public static void setWifiAp(Context context, boolean isEnable){ ConnectivityManager connManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); Field iConnMgrField = null; try { iConnMgrField = connManager.getClass().getDeclaredField("mService"); iConnMgrField.setAccessible(true); Object iConnMgr = iConnMgrField.get(connManager); Class<?> iConnMgrClass = Class.forName(iConnMgr.getClass().getName()); if(isEnable){ Method startTethering = iConnMgrClass.getMethod("startTethering", int.class, ResultReceiver.class, boolean.class); startTethering.invoke(iConnMgr, 0, null, true); }else{ Method startTethering = iConnMgrClass.getMethod("stopTethering", int.class); startTethering.invoke(iConnMgr, 0); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_start: if(getWifiAPState() != WIFI_AP_STATE_ENABLED){ if (Build.VERSION.SDK_INT >= 26) { WifiConfiguration config = new WifiConfiguration(); wifiManager = (WifiManager)getApplicationContext().getSystemService(WIFI_SERVICE); config.SSID = "TEST";//热点名称 config.preSharedKey = "123456789";//热点密码 // mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, // true, new ONStartTetheringCallback()); setWifiAp(this,true); // wifiManager = (WifiManager)getApplicationContext().getSystemService(WIFI_SERVICE); // Method method = wifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class,Boolean.TYPE); // boolean enable = (Boolean)method.invoke(wifiManager,config,true); } } // setWifiApEnabledForAndroid(); // turnOnWifiAp("TEST","123456789",WifiSecurityType.WIFICIPHER_WPA2); // startTethering(); // setWifi(); break; case R.id.btn_stop: if(getWifiAPState() != WIFI_AP_STATE_DISABLED){ if (Build.VERSION.SDK_INT >= 26) { mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); } } break; } } class ONStartTetheringCallback extends ConnectivityManager.OnStartTetheringCallback { } private class WifiApReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "onReceive: " intent.getAction()); if (WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) { int cstate = intent.getIntExtra(EXTRA_WIFI_AP_STATE, -1); if (cstate == WIFI_AP_STATE_ENABLED) { Snackbar.make(mLayout, "热点已开启", Snackbar.LENGTH_LONG).show(); }else if (cstate == WIFI_AP_STATE_ENABLING){ Snackbar.make(mLayout, "热点正在开启", Snackbar.LENGTH_SHORT).show(); }else if (cstate == WIFI_AP_STATE_DISABLED){ Snackbar.make(mLayout, "热点已关闭", Snackbar.LENGTH_LONG).show(); }else if (cstate == WIFI_AP_STATE_DISABLING){ Snackbar.make(mLayout, "热点正在关闭", Snackbar.LENGTH_SHORT).show(); } } } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } public int getWifiAPState() { int state = -1; try { Method method2 = mWifiManager.getClass().getMethod("getWifiApState"); state = (Integer) method2.invoke(mWifiManager); } catch (Exception e) { e.printStackTrace(); } Log.i(TAG, "getWifiAPState.state " state); return state; } ///////////////////////////////////// public final static boolean DEBUG = true; public static final int MESSAGE_AP_STATE_ENABLED = 1; public static final int MESSAGE_AP_STATE_FAILED = 2; //默认wifi秘密 private static final String DEFAULT_AP_PASSWORD = "12345678"; private static Handler mHandler; private static Context mContext; //监听wifi热点的状态变化 public enum WifiSecurityType { WIFICIPHER_NOPASS, WIFICIPHER_WPA, WIFICIPHER_WPA2 } public boolean turnOnWifiAp(String str, String password,WifiSecurityType Type) { String ssid = str; //配置热点信息。 WifiConfiguration wcfg = new WifiConfiguration(); wcfg.SSID = new String(ssid); wcfg.networkId = 1; wcfg.allowedAuthAlgorithms.clear(); wcfg.allowedGroupCiphers.clear(); wcfg.allowedKeyManagement.clear(); wcfg.allowedPairwiseCiphers.clear(); wcfg.allowedProtocols.clear(); if(Type == WifiSecurityType.WIFICIPHER_NOPASS) { if(DEBUG)Log.d(TAG, "wifi ap----no password"); wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN, true); wcfg.wepKeys[0] = ""; wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); wcfg.wepTxKeyIndex = 0; } else if(Type == WifiSecurityType.WIFICIPHER_WPA) { if(DEBUG)Log.d(TAG, "wifi ap----wpa"); //密码至少8位,否则使用默认密码 if(null != password && password.length() >= 8){ wcfg.preSharedKey = password; } else { wcfg.preSharedKey = DEFAULT_AP_PASSWORD; } wcfg.hiddenSSID = false; wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wcfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); //wcfg.allowedKeyManagement.set(4); wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); } else if(Type == WifiSecurityType.WIFICIPHER_WPA2) { if(DEBUG)Log.d(TAG, "wifi ap---- wpa2"); //密码至少8位,否则使用默认密码 if(null != password && password.length() >= 8){ wcfg.preSharedKey = password; } else { wcfg.preSharedKey = DEFAULT_AP_PASSWORD; } wcfg.hiddenSSID = true; wcfg.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wcfg.allowedKeyManagement.set(4); //wcfg.allowedKeyManagement.set(4); wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wcfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wcfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wcfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); } try { Method method = mWifiManager.getClass().getMethod("setWifiApConfiguration", wcfg.getClass()); Boolean rt = (Boolean)method.invoke(mWifiManager, wcfg); if(DEBUG) Log.d(TAG, " rt = " rt); } catch (NoSuchMethodException e) { Log.e(TAG, e.getMessage()); } catch (IllegalArgumentException e) { Log.e(TAG, e.getMessage()); } catch (IllegalAccessException e) { Log.e(TAG, e.getMessage()); } catch (InvocationTargetException e) { Log.e(TAG, e.getMessage()); } return setWifiApEnabled(); } private boolean setWifiApEnabled() { //开启wifi热点需要关闭wifi while(mWifiManager.getWifiState() != WifiManager.WIFI_STATE_DISABLED){ mWifiManager.setWifiEnabled(false); try { Thread.sleep(200); } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } } // 确保wifi 热点关闭。 while(getWifiAPState() != WIFI_AP_STATE_DISABLED){ try { Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); method1.invoke(mWifiManager, null, false); Thread.sleep(200); } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } } //开启wifi热点 try { Method method1 = mWifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); method1.invoke(mWifiManager, null, true); Thread.sleep(200); } catch (Exception e) { Log.e(TAG, e.getMessage()); return false; } return true; } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论