天天看點

android系統提供接口實作代碼控制熱點開關

設定中有控制熱點的開關,并且有相關的類型和密碼設定,但如何通過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方法。