3.2.3 代码修改
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适配
Android8.0开始默认移除了
org.apache.http.legacy
,需要指定使用这个库:在manifest的application标签中加入标签<uses-library android:name="org.apache.http.legacy" android:required="false"/>
。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接口是一个异步接口,并且无回调。使用时建议使用单独按钮实现,最好不要在退出应用按钮中实现注销流程。