设置中有控制热点的开关,并且有相关的类型和密码设置,但如何通过api在第三方app开发中控制呢?android 9.0的api为了安全,并不允许除systemuid之外的app控制热点,
android 代码设置、打开wifi热点及热点的连接
以上blog也仅对android 5.1有效。
那只能通过系统提供对外接口,然后在设置中进行控制,接口形式为广播:
Index: frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
===================================================================
--- frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java (版本 4616)
+++ frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java (版本 4619)
@@ -116,6 +116,7 @@
sBackgroundActionWhiteListArraySet.add("com.android.action.LOCATION_STATE");
+ sBackgroundActionWhiteListArraySet.add("android.intent.action.HOTSPOT_STATE_CHANGED"); // @ + for BUG #
}
Index: packages/apps/Settings/AndroidManifest.xml
===================================================================
--- packages/apps/Settings/AndroidManifest.xml (版本 4616)
+++ packages/apps/Settings/AndroidManifest.xml (版本 4619)
@@ -3485,6 +3485,7 @@
<action android:name="com.android.action.GET_FIRST_DATA_NETWORK" />
<action android:name="com.android.action.SWITCH_FIRST_DATA_NETWORK" />
+ <action android:name="android.intent.action.HOTSPOT_STATE_CHANGED" /> <!-- @ + for BUG # -->
</intent-filter>
</receiver>
Index: packages/apps/Settings/src/com/android/settings/BootCompleteReceiver.java
===================================================================
--- packages/apps/Settings/src/com/android/settings/BootCompleteReceiver.java (版本 4616)
+++ packages/apps/Settings/src/com/android/settings/BootCompleteReceiver.java (版本 4619)
@@ -16,10 +16,15 @@
package com.android.settings;
+import static android.net.ConnectivityManager.TETHERING_WIFI;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.os.Looper;
import android.util.Log;
import java.io.IOException;
import android.app.AlertDialog;
@@ -731,5 +736,23 @@
thr.start();
}
-
+
+ // @ + for BUG # {
+ void startTether() {
+ mConnectivityManager.startTethering(TETHERING_WIFI, true /* showProvisioningUi */,
+ mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
+ }
+
+ void stopTether() {
+ mConnectivityManager.stopTethering(TETHERING_WIFI);
+ }
+
+ final ConnectivityManager.OnStartTetheringCallback mOnStartTetheringCallback =
+ new ConnectivityManager.OnStartTetheringCallback() {
+ @Override
+ public void onTetheringFailed() {
+ super.onTetheringFailed();
+ }
+ };
+ // @ + for BUG # }
}
以上功能仅支持对开关的控制,如果要设置ssid和密码,需要通过反射wifimanager的setWifiApConfiguration方法。