[RK3399][Android7.1]平台连接Captive Portal wifi时自动跳转到登录界面

背景

   原生sdk连接portal网络后,会在状态栏弹出“登录到Wlan网络”的通知,下来状态栏也会有此消息,但不会自动跳转到验证登录界面,下面代码就是实现自动跳转登录界面的代码

实现方法

1.刚开始在csdn找到通过浏览器实现自动跳转到登录界面,经验证确实是可以的,方法链接如下:

【定制Android系统】Android 7.1 实现连接 Captive Portal WiFi 时自动弹出登录页面

但我们的客户是不内置浏览器的,所以只能用其他方法了

2.通过查看源码frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java

发现了一个更简单的方法,把点击通知栏“登录到Wlan网络”跳转到登录界面的操作(这里实际是启动了CaptivePortalLogin.apk,CaptivePortalLogin使用的是webwiew),直接在代码里启动就好了。

补丁如下:

--- a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -75,6 +75,10 @@ import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;+// start captive portal enable by lpz 20210701
+import android.os.SystemProperties;
+// end captive portal enable by lpz 20210701
+/*** {@hide}*/
@@ -86,10 +90,16 @@ public class NetworkMonitor extends StateMachine {// Default configuration values for captive portal detection probes.// TODO: append a random length parameter to the default HTTPS url.// TODO: randomize browser version ids in the default User-Agent String.
-    private static final String DEFAULT_HTTPS_URL     = "https://www.google.com/generate_204";
+    //private static final String DEFAULT_HTTPS_URL     = "https://www.google.com/generate_204";
+    //private static final String DEFAULT_HTTP_URL      =
+    //        "http://connectivitycheck.gstatic.com/generate_204";
+    //private static final String DEFAULT_FALLBACK_URL  = "http://www.google.com/gen_204";
+    // start captive portal enable by lpz 20210701
+    private static final String DEFAULT_HTTPS_URL     = "https://captive.v2ex.co/generate_204";private static final String DEFAULT_HTTP_URL      =
-            "http://connectivitycheck.gstatic.com/generate_204";
-    private static final String DEFAULT_FALLBACK_URL  = "http://www.google.com/gen_204";
+            "http://g.cn/generate_204";
+    private static final String DEFAULT_FALLBACK_URL  = "http://g.cn/generate_204";
+    // end captive portal enable by lpz 20210701private static final String DEFAULT_USER_AGENT    = "Mozilla/5.0 (X11; Linux x86_64) "+ "AppleWebKit/537.36 (KHTML, like Gecko) "+ "Chrome/52.0.2743.82 Safari/537.36";
@@ -289,6 +299,11 @@ public class NetworkMonitor extends StateMachine {mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0) == 1;
+        // start captive portal enable by lpz 20210701
+        if(SystemProperties.get("persist.sys.portalenable","false").equals("true")){
+            mIsCaptivePortalCheckEnabled = true;
+        }
+        // end captive portal enable by lpz 20210701mUseHttps = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1;@@ -505,7 +520,7 @@ public class NetworkMonitor extends StateMachine {}@Override
-        public boolean processMessage(Message message) {
+        public boolean processMessage(Message message) { switch (message.what) {case CMD_REEVALUATE:if (message.arg1 != mReevaluateToken || mUserDoesNotWant)
@@ -542,12 +557,41 @@ public class NetworkMonitor extends StateMachine {// if this is found to cause problems.CaptivePortalProbeResult probeResult = isCaptivePortal();if (probeResult.isSuccessful()) {
+                        Log.d(TAG, "---lpz---: probeResult.isSuccessful");transitionTo(mValidatedState);} else if (probeResult.isPortal()) {
+                        Log.d(TAG, "---lpz---: probeResult.isPortal probeResult.redirectUrl="+probeResult.redirectUrl);
-                         mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
-                                 NETWORK_TEST_RESULT_INVALID, mNetId, probeResult.redirectUrl));mLastPortalProbeResult = probeResult;
-                         transitionTo(mCaptivePortalState);
+                        // start auto jump to WiFi Portal login window by lpz 20210701
+                        // start Captiveportallogin.apk Pop up window to log in portal wifi
+                        if(SystemProperties.get("persist.sys.portallogin","false").equals("true")){
+                            Log.d(TAG, "---lpz---: start Captiveportallogin.apk sign in");
+                            final Intent intent = new Intent(ConnectivityManager.ACTION_CAPTIVE_PORTAL_SIGN_IN);
+                            intent.putExtra(ConnectivityManager.EXTRA_NETWORK, mNetworkAgentInfo.network);
+                            intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL,
+                                    new CaptivePortal(new ICaptivePortal.Stub() {
+                                        @Override
+                                        public void appResponse(int response) {
+                                            if (response == APP_RETURN_WANTED_AS_IS) {
+                                                mContext.enforceCallingPermission(
+                                                        android.Manifest.permission.CONNECTIVITY_INTERNAL,
+                                                        "CaptivePortal");
+                                            }
+                                            sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, response);
+                                        }
+                                    }));
+                            intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL,
+                                    mLastPortalProbeResult.detectUrl);
+                            intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT,
+                                    getCaptivePortalUserAgent(mContext));
+                            intent.setFlags(
+                                    Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
+                            mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+                        }
+                        // end auto jump to WiFi Portal login window by lpz 20210701
+                        mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
+                                NETWORK_TEST_RESULT_INVALID, mNetId, probeResult.redirectUrl));
+                        //mLastPortalProbeResult = probeResult;
+                        transitionTo(mCaptivePortalState);
+                        // start auto jump to WiFi Portal login window by lpz 20210701
+                        mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_PROVISIONING_NOTIFICATION,
+                                0, mNetworkAgentInfo.network.netId, null));
+                        // end auto jump to WiFi Portal login window by lpz 20210701} else {final Message msg = obtainMessage(CMD_REEVALUATE, ++mReevaluateToken, 0);sendMessageDelayed(msg, mReevaluateDelayMs);
(END)

参考:

【定制Android系统】Android 7.1 实现连接 Captive Portal WiFi 时自动弹出登录页面


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部