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