代码集成步骤

1、修改AndroidManifest.xml文件

1.添加权限和服务,参考demo

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<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_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

2.添加EasyappSvpnService、TimeQryService服务

<!-- VpnService服务 -->
<service android:name="com.sangfor.ssl.l3vpn.service.EasyappSvpnService"
        android:permission="android.permission.BIND_VPN_SERVICE"
        android:exported="false">
        <intent-filter>
            <action android:name="com.sangfor.ssl.l3vpn.service.EasyappSvpnService" />
        </intent-filter>
</service>

<!-- TimeQry服务 -->
<service android:name="com.sangfor.ssl.service.timeqry.TimeQryService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.sangfor.ssl.vpn.sdk.action.ACTION_TIMEQRY" />
        </intent-filter>
</service>

3.L3VPN模式注意事项:

Activity的launchMode不能设置为 singleInstance,否则L3VPN服务启动会失败。 原因:L3VPN模式需要通过startActivityForResult向系统申请使用L3VPN权限,但startActivityForResult有限制: You cannot use startActivityForResult() if the activity being started is not running in the same task as the activity that starts it. 也就是说当前Activity的launchMode不能设置为 singleInstance。

4.Android9.0适配

  1. Android8.0开始默认移除了org.apache.http.legacy,需要指定使用这个库:在manifest的application标签中加入标签 <uses-library android:name="org.apache.http.legacy" android:required="false"/>

  2. Android9.0开始默认不允许使用http协议,因此需要在manifest的application标签中加入属性android:usesCleartextTraffic="true"

2、实现接口

1.实现LoginResultListener,用于接收登录的结果

public class LoginActivity implements LoginResultListener, RandCodeListener{
     public void onLoginFailed(String err) { /*登录失败结果*/}
      public void onLoginProcess(int nextAuthType, BaseMessage messag){/*存在组合认证时,回调此方法,获取下一个认证的参数*/}
      public void onLoginSuccess(){/*登录成功结果*/}
}

2.实现RandCodeListener,用于接收图形校验码。适应多次登录失败,检测为爆破登录,需携带图形校验码进行认证。

public class LoginActivity implements LoginResultListener, RandCodeListener{
     void onShowRandCode(Drawable drawable)  
}

3.L3VPN模式下,重写onActivityresult,请参考demo

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      switch(requestCode) {
        case IVpnDelegate.REQUEST_L3VPNSERVICE: 
         mSFManager.onActivityResult(requestCode, resultCode);
         break;
      }
      super.onActivityResult(requestCode, resultCode, data);
}

3、初始化VPN参数

private void initLoginParms() {
        // 1.构建SangforAuthManager对象
        mSFManager = SangforAuthManager.getInstance();

        // 2.设置VPN认证结果回调
        try {
            mSFManager.setLoginResultListener(this);
        }catch (SFException e) {
            Log.info(TAG, "SFException:%s", e);
        }

        //3.设置登录超时时间,单位为秒
        mSFManager.setAuthConnectTimeOut(8);
    }

4、开始VPN登录

/*模式为L3VPN模式时,this需传递Activity的上下文。EasyAPP模式可为Activity或者Application*,以密码登录为例/
mSFManager.startPasswordAuthLogin(getApplication(), LoginActivity.this, mVpnMode, mVpnAddressURL, mUserName, mUserPassword);

说明:startPasswordAuthLogin方法中,会实现VPN的初始化(测试网络等)及登录过程,时间相对长一点。 &emsp 1.登录过程中,认证参数设置

在登录过程,可能存在各种情况需要用户手动输入参数,如组合认证中短信验证码输入、爆破登录需输入图形校验码等,此类处理逻辑在onLoginProcess()方法中。

    public void onLoginProcess(int nextAuthType, BassMessage message) { /*登录中结果*/}

组合认证情况相对复杂,Demo中已将全部组合认证场景一一罗列,以dialog形式呈现,只需做相应的复制即可。

1)复制createAuthDialog方法,以及相应的createDialogView、commitAdditional、smsCountDownTimer;

2)复制Demo中com.sangfor.user下的java文件及layout下布局文件dialog_*.xml、drawable下edit_bg.xml;

3)(可选)根据需求修改dialog样式;

4)(可选)删除不需要的辅助认证(不建议,管理员可能随时修改认证方式)。

说明:

1)组合认证:包含短信认证、挑战认证、令牌认证、二次密码认证、二次证书认证等需用户干预的认证方式,再登录过程中,需回调到onloginProcess中,供用户输入参数后继续登录。通过Dialog获取用户信息,参考Demo写法;

2)图形校验码:服务端默认设置爆破登录,输入三次,再次登录需校验图形校验码。通过Dialog获取用户信息,参考Demo写法;

3)登录密码不符合密码策略:首次登录需强制修改密码。通过Dialog获取用户信息,参考Demo写法。 &emsp 2.登录失败

    public void onLoginFailed(String err) { /*登录失败结果*/}

说明:一般的认证失败情况,如密码错误等。此时只需显示失败结果err即可。 &emsp 3.登录成功

    public void onLoginSuccess(){/*登录成功结果*/}

说明:接收onLoginSuccess回调,表示登录成功,至此,可访问VPN内网资源。 &emsp 4.注销

    SangforAuthManager.getInstance().vpnLogout(){}

说明:vpnLogout接口是一个异步接口,并且无回调。使用时建议使用单独按钮实现,最好不要在退出应用按钮中实现注销流程。