Android WiFi熱點7.1以上版本適配

代碼地址以下:<br>http://www.demodashi.com/demo/13907.htmlhtml

###1、準備工做 開發環境:  jdk1.8  AS(3.0.1) 運行環境:  華爲V10(Android8.0)、華爲p20(Android8.1)、華爲mate10(Android8.0)android

實現功能:   Wifi熱點的開啓關閉。微信

2、代碼結構

工程目錄

3、代碼詳解

Android 7.0及之前Wifi熱點 Android 7.一、8.0Wifi熱點app

看以前評論發現Android7.1以上的手機開啓Wifi熱點後不能正常使用,故研究了一下如何解決次問題。ide

Android 7.0 開啓Wifi熱點

在Android7.0及之前的版本開啓Wifi熱點的方式以下:gradle

WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Method method = mWifiManager.getClass().getMethod("setWifiApEnabled",
                        WifiConfiguration.class, boolean.class);
//反射
method.invoke(mWifiManager, null, false);

Android 7.1 開啓Wifi熱點

對於Android7.一、8.0的設備,經過WifiManager setWifiApEnabled,能夠打開Wifi熱點,可是會發現此熱點,鏈接不上(因爲DHCP沒有開啓),因此不會分配ip地址,也就致使不能正常使用。ui

在Android7.1系統應用Settings,發現其開啓熱點的方式是經過ConnectivityManager的startTethering方法來開啓的。 查看ConnectivityManager的方法 三個參數 四個參數 startTethering 是隱藏的方法,而且第三個參數OnStartTetheringCallback是ConnectivityManager內部抽象類,也是隱藏的。lua

/**
* Callback for use with {@link #startTethering} to find out whether tethering succeeded.
* @hide
*/
@SystemApi
public static abstract class OnStartTetheringCallback {
    /**
     * Called when tethering has been successfully started.
     */
    public void onTetheringStarted() {};
    /**
	 * Called when starting tethering failed.
     */
	public void onTetheringFailed() {};
}

經過反射的方式並無找到方式獲取startTethering方法,以及建立OnStartTetheringCallback子對象。spa

後來經過另外一種方式實現了。.net

配置jar包

首先修改ConnectivityManager源碼,將TETHERING_WIFI字段、startTethering方法及OnStartTetheringCallback類中隱藏相關的標誌去掉,而後單獨編譯一個jar包。 將jar包拷貝到工程中,以下所示: wifiap jar包 該jar包會和官方sdk中的android.jar會有衝突,因此須要配置jar包的優先級。 在app的build.gradle中配置

provided files('src/main/libs/WifiAp8.jar')

在工程下的build.gradle中添加以下配置:

allprojects {
    
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
        //設置jar相對包路徑或絕對路徑
            options.compilerArgs.add('-Xbootclasspath/p:app/src/main/libs/WifiAp8.jar')
        }
    }
}
編寫代碼

<font color=#0099ff size=4>開啓熱點</font>

if(getWifiAPState() != WIFI_AP_STATE_ENABLED){
	//Android7.1及以上版本
    if (Build.VERSION.SDK_INT >= 25) {
        mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI,
                true, new ONStartTetheringCallback());
    }
}

紅色不影響 在AS中上述代碼會有紅色顯示,可是不影響編譯使用。能夠正常編譯生成apk。使用該方法不須要提早關閉wifi。

ONStartTetheringCallback類繼承了OnStartTetheringCallback抽象類。

class ONStartTetheringCallback extends
        ConnectivityManager.OnStartTetheringCallback {
}

<font color=#0099ff size=4>關閉熱點</font>

if(getWifiAPState() != WIFI_AP_STATE_DISABLED){
	//Android7.1及以上版本
    if (Build.VERSION.SDK_INT >= 25) {
        mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
    }
}

<font color=#0099ff size=4>權限</font> 使用上述功能須要這三個權限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

還須要在代碼中申請WRITE_SETTINGS權限,不然不能正常使用。

這樣就能夠了,不僅是系統應用能夠使用,平成的應用也能夠正常使用。親測(華爲P20、華爲mate十、華爲V10均可以正常使用)。

歡迎你們關注、評論、點贊。 大家的支持是我堅持的動力。 歡迎關注個人微信公衆號Android WiFi熱點7.1以上版本適配

代碼地址以下:<br>http://www.demodashi.com/demo/13907.html

注:本文著做權歸做者,由demo大師代發,拒絕轉載,轉載須要做者受權

相關文章
相關標籤/搜索