• android9.0之后wifi热点原生接口开发示例


    话不多说,直接上代码了,这示例是直接调用原生接口实现的,没有使用反射的方式,如果找不到接口无法编译,请依赖一下对应系统的framewords.jar,并且参考我https://www.cnblogs.com/huhe/p/15848891.html文章的说明配置一下androidStudio编译环境即可

    MainActivity.java
      1 package com.xxx.wifi_ap;
      2 
      3 import static android.net.ConnectivityManager.TETHERING_WIFI;
      4 
      5 import androidx.appcompat.app.AppCompatActivity;
      6 
      7 import android.content.BroadcastReceiver;
      8 import android.content.Context;
      9 import android.content.Intent;
     10 import android.content.IntentFilter;
     11 import android.net.ConnectivityManager;
     12 import android.net.wifi.WifiConfiguration;
     13 import android.net.wifi.WifiManager;
     14 import android.os.Bundle;
     15 import android.os.Handler;
     16 import android.os.Looper;
     17 import android.util.Log;
     18 import android.view.MotionEvent;
     19 import android.view.View;
     20 import android.view.inputmethod.InputMethodManager;
     21 import android.widget.Button;
     22 import android.widget.EditText;
     23 import android.widget.LinearLayout;
     24 import android.widget.TextView;
     25 import android.widget.Toast;
     26 
     27 public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener {
     28 
     29     private static final IntentFilter WIFI_INTENT_FILTER = new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
     30     private static final String TAG = "MainActivity";
     31     private ConnectivityManager mConnectivityManager;
     32     private WifiManager mWifiManager;
     33     private final ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
     34             new ConnectivityManager.OnStartTetheringCallback() {
     35                 @Override
     36                 public void onTetheringFailed() {
     37                     super.onTetheringFailed();
     38                     Log.e(TAG,"onTetheringFailed!!!");
     39                 }
     40             };
     41 
     42     private LinearLayout root_layout;
     43     private Button mAPEnable;
     44     private EditText mEditName;
     45     private EditText mEditPwd;
     46     private TextView mApMsg;
     47     private Button mSave;
     48     private Button mGoDesktop;
     49     private boolean mIsOnClick;
     50     private String mApName,mApPwd;
     51 
     52     @Override
     53     protected void onCreate(Bundle savedInstanceState) {
     54         super.onCreate(savedInstanceState);
     55         setContentView(R.layout.activity_main);
     56 
     57         mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
     58         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
     59 
     60         WIFI_INTENT_FILTER.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
     61         registerReceiver(mReceiver, WIFI_INTENT_FILTER);
     62 
     63         mInitView();
     64     }
     65 
     66     @Override
     67     protected void onDestroy() {
     68         unregisterReceiver(mReceiver);
     69         super.onDestroy();
     70     }
     71 
     72     private void mInitView(){
     73         root_layout = findViewById(R.id.root_layout);
     74         root_layout.setOnTouchListener(this);
     75 
     76         mAPEnable = findViewById(R.id.ap_enable);
     77         mAPEnable.setText(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED?"打开热点":"关闭热点");
     78 
     79         mEditName = findViewById(R.id.edit_name);
     80         mApName = mWifiManager.getWifiApConfiguration().SSID;
     81         mEditName.setText(mApName);
     82 
     83         mEditPwd = findViewById(R.id.edit_pwd);
     84         mApPwd = mWifiManager.getWifiApConfiguration().preSharedKey;
     85         mEditPwd.setText(mApPwd);
     86 
     87         mApMsg = findViewById(R.id.ap_msg);
     88         mSave = findViewById(R.id.save_data);
     89         mGoDesktop = findViewById(R.id.go_desktop);
     90 
     91         mAPEnable.setOnClickListener(this);
     92         mSave.setOnClickListener(this);
     93         mGoDesktop.setOnClickListener(this);
     94     }
     95 
     96     private void setApName(String deviceName) {
     97         final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
     98         config.SSID = deviceName;
     99         // TODO: If tether is running, turn off the AP and restart it after setting config.
    100         mWifiManager.setWifiApConfiguration(config);
    101     }
    102 
    103     private void setApPassword(String devicePwd) {
    104         final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
    105         config.preSharedKey = devicePwd;
    106         // TODO: If tether is running, turn off the AP and restart it after setting config.
    107         mWifiManager.setWifiApConfiguration(config);
    108     }
    109 
    110     private void setApProfile(int deviceProfile) {
    111         final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
    112         config.allowedKeyManagement.set(deviceProfile);
    113         // TODO: If tether is running, turn off the AP and restart it after setting config.
    114         mWifiManager.setWifiApConfiguration(config);
    115     }
    116 
    117     private int getApProfile(){
    118         final WifiConfiguration config = mWifiManager.getWifiApConfiguration();
    119         int mSecurityValue;
    120         if (config != null && config.getAuthType() == WifiConfiguration.KeyMgmt.NONE) {
    121             mSecurityValue = WifiConfiguration.KeyMgmt.NONE;
    122         } else {
    123             mSecurityValue = WifiConfiguration.KeyMgmt.WPA2_PSK;
    124         }
    125         return mSecurityValue;
    126     }
    127 
    128     private String getApProfileStr(int profile){
    129         return profile == WifiConfiguration.KeyMgmt.NONE?"NONE":"WPA2_PSK";
    130     }
    131 
    132     private void setApEnable(boolean enable){
    133         if(enable){
    134             startTether();
    135         }else {
    136             stopTether();
    137         }
    138     }
    139 
    140     private void saveConfig(){
    141         if(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED){
    142             runOnUiThread(new Runnable() {
    143                 @Override
    144                 public void run() {
    145                     Toast.makeText(MainActivity.this, "请先打开热点再保存修改!", Toast.LENGTH_LONG).show();
    146                 }
    147             });
    148             return;
    149         }
    150 
    151         if(!mApName.equals(mEditName.getText().toString())){
    152             setApName(mEditName.getText().toString());
    153         }
    154 
    155         if(!mApPwd.equals(mEditPwd.getText().toString())){
    156             setApPassword(mEditPwd.getText().toString());
    157         }
    158     }
    159 
    160     @Override
    161     public void onClick(View v) {
    162         switch (v.getId()){
    163             case R.id.ap_enable:
    164                 try {
    165                     setApEnable(mIsOnClick = !mIsOnClick);
    166                 }catch (Exception e){
    167                     e.printStackTrace();
    168                 }
    169                 break;
    170             case R.id.save_data:
    171                 try {
    172                     saveConfig();
    173                 }catch (Exception e){
    174                     e.printStackTrace();
    175                 }
    176                 break;
    177             case R.id.go_desktop:
    178                 moveTaskToBack(true);
    179                 break;
    180         }
    181     }
    182 
    183     void stopTether() {
    184         Log.i(TAG,"stopTether()");
    185         mConnectivityManager.stopTethering(TETHERING_WIFI);
    186     }
    187 
    188     void startTether() {
    189         Log.i(TAG,"startTether()");
    190         mConnectivityManager.startTethering(TETHERING_WIFI, true,
    191                 mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
    192     }
    193 
    194     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    195         @Override
    196         public void onReceive(Context context, Intent intent) {
    197             String action = intent.getAction();
    198             if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
    199                 final int state = intent.getIntExtra(
    200                         WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
    201                 handleWifiApStateChanged(state);
    202             } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
    203             }
    204         }
    205     };
    206 
    207     private void handleWifiApStateChanged(int state) {
    208         String changed;
    209         switch (state) {
    210             case WifiManager.WIFI_AP_STATE_ENABLING:
    211                 Log.i(TAG,"WIFI_AP_STATE_ENABLING");
    212                 changed = "热点开启中";
    213                 break;
    214             case WifiManager.WIFI_AP_STATE_ENABLED:
    215                 Log.i(TAG,"WIFI_AP_STATE_ENABLED");
    216                 changed = "热点已开启";
    217                 break;
    218             case WifiManager.WIFI_AP_STATE_DISABLING:
    219                 Log.i(TAG,"WIFI_AP_STATE_DISABLING");
    220                 changed = "热点关闭中";
    221                 break;
    222             case WifiManager.WIFI_AP_STATE_DISABLED:
    223                 Log.i(TAG,"WIFI_AP_STATE_DISABLED");
    224                 changed = "热点已关闭";
    225                 break;
    226             default:
    227                 Log.i(TAG,"default");
    228                 changed = "default";
    229                 break;
    230         }
    231         updateApInfo(changed);
    232     }
    233 
    234     private void updateApInfo(String changed) {
    235         String name = mWifiManager.getWifiApConfiguration().SSID;
    236         String pwd = mWifiManager.getWifiApConfiguration().preSharedKey;
    237         String profile = getApProfileStr(getApProfile());
    238 
    239         mUpdateMsg("stateChanged:"+changed+" name:"+name+" pwd:"+pwd+" profile:"+profile);
    240     }
    241 
    242     private void mUpdateMsg(String msg){
    243         runOnUiThread(() -> {
    244             mAPEnable.setText(mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED?"打开热点":"关闭热点");
    245             mApMsg.setText(msg);
    246         });
    247     }
    248 
    249     @Override
    250     public boolean onTouch(View view, MotionEvent motionEvent) {
    251         if(null != getCurrentFocus()){
    252             InputMethodManager manager= (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    253             if(manager != null){
    254                 return manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
    255             }
    256             return false;
    257         }
    258         return true;
    259     }
    260 }
    activity_main.xml
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:app="http://schemas.android.com/apk/res-auto"
     4     android:id="@+id/root_layout"
     5     xmlns:tools="http://schemas.android.com/tools"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     android:layout_gravity="center"
     9     android:gravity="center"
    10     android:orientation="vertical"
    11     tools:context=".MainActivity">
    12 
    13     <Button
    14         android:id="@+id/ap_enable"
    15         android:layout_width="wrap_content"
    16         android:layout_height="wrap_content"
    17         android:text="打开热点"/>
    18 
    19     <TextView
    20         android:id="@+id/ap_msg"
    21         android:layout_width="wrap_content"
    22         android:layout_height="wrap_content"
    23         android:text="热点已关闭"/>
    24 
    25     <EditText
    26         android:id="@+id/edit_name"
    27         android:layout_width="200dp"
    28         android:layout_height="wrap_content"
    29         android:hint="热点名称"/>
    30 
    31     <EditText
    32         android:id="@+id/edit_pwd"
    33         android:layout_width="200dp"
    34         android:layout_height="wrap_content"
    35         android:hint="热点密码"/>
    36 
    37     <Button
    38         android:id="@+id/save_data"
    39         android:layout_width="wrap_content"
    40         android:layout_height="wrap_content"
    41         android:text="保存修改"/>
    42 
    43     <Button
    44         android:id="@+id/go_desktop"
    45         android:layout_width="wrap_content"
    46         android:layout_height="wrap_content"
    47         android:text="回到桌面"/>
    48 
    49 </LinearLayout>
  • 相关阅读:
    C语言volatile关键字的用法
    UDP广播包
    进程和线程的区别
    Unix/Linux进程间通信
    虚拟空间,malloc
    自我介绍
    java初始化顺序
    java 队列基础操作
    java IO基础操作
    Python中的Tab补全功能添加
  • 原文地址:https://www.cnblogs.com/huhe/p/15950042.html
Copyright © 2020-2023  润新知