在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → 创建wifi热点、关闭、开启wifi热点 示例源码(Android8.0)

创建wifi热点、关闭、开启wifi热点 示例源码(Android8.0)

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:27.05M
  • 下载次数:38
  • 浏览次数:1129
  • 发布时间:2019-09-19
  • 实例类别:Android平台开发
  • 发 布 人:hcaiqlt1314
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Android wifi 热点 关闭

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

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


}

实例下载地址

创建wifi热点、关闭、开启wifi热点 示例源码(Android8.0)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警