过期卡锁卡需求-卡2依赖卡1(越南为例)
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
很多运营商要求过期卡能当作是无效卡来处理。如果有依赖关系,其依赖关系不起作用.
卡2依赖卡1,如果卡1插入过期卡,卡2也要无法使用.
[SOLUTION]
过期卡是不能注册上网络的,所以判断的方法就是看是否能注册上网络。如果不能注册上,则认为是
Expired SIM Viettel.
但是因为网络环境,有效卡也有可能无法注册上网络,在当次开机会被识别为过期卡。
不过下一次开机如果能正常注册上网络,还是能识别出来是有效卡,这种case贵司要考虑清楚。
如果有其他的方式识别过期卡,还请使用其他方式具体方案来实现需求.
以越南的如下需求为例:
需求分析如下:
只有卡1 插入注册上网络的Viettel卡才能使用。其他case都不能使用
Modem端
请参考DMS文档“SIM-ME lock",配置NVRAM_EF_SML_DEFAULT
卡1 只允许Viettel卡有效, 卡2 所有卡都锁住
case 2,4,5,6,7,8 12,13,14 满足需求.
APP端
(1) 实现卡2对卡1的依赖
当卡1插入”注册上网络的Viettel卡”, 如果卡2被locked住,自行解锁。
case 1,3,15 满足需求
case 15说明:卡2依赖卡1解锁之后,卡2无法注册上网络也是无法normal use
No. SIM slot 1 SIM slot 2 Requirement
1 SIM Viettel SIM Viettel Both of SIMs working as normal
2 SIM Viettel Null SIM1 working as normal
3 SIM Viettel SIM Non-Viettel Both of SIMs working as normal
4 Null SIM Viettel Lock
5 SIM Non-Viettel SIM Viettel Lock
6 SIM Non-Viettel Null Lock
7 Null SIM Non-Viettel Lock
8 SIM Non-Viettel SIM Non-Viettel Lock
9 Expired SIM Viettel Null Lock
10 Expired SIM Viettel SIM Non-Viettel Lock
11 Expired SIM Viettel Expired SIM Viettel Lock
12 SIM Non-Viettel Expired SIM Viettel Lock
13 Null Expired SIM Viettel Lock
14 Null Null Normal as Non-SIM, able to access the main 15 SIM Viettel Expired SIM Viettel Only SIM 1 working as normal
16 Expired SIM Viettel SIM Viettel Lock
(2) Lock screen
当卡1插入”没有注册上网络的Viettel卡”, Lock screen
case 9,10,11,16 满足需求
----------------------------
获取卡的状态函数:
TelephonyManagerEx.Java getSimState(int simId) 获取卡的状态
SIM_STATE_NETWORK_LOCKED 表示当前卡被SIM ME locked
获取卡注册网络情况
KK之前版本 PhoneInterfaceManager.java getSimIndicatorStateGemini(int simId)
KK之后的版本 PhoneInterfaceManagerEx.java getSimIndicatorState(int simId)
PhoneConstants.SIM_INDICATOR_NORMAL 表示成功注册上了网络.
app端具体做法如下:
case 1: 卡1成功注册上网络之后,卡2才上报NETWORK_LOCKED, 则在keyguard中卡2上报
LOCKED时解锁卡2
case 2: 卡2上报NETWORK_LOCKED之后, 卡1才成功注册上网络,则在GSMPhone中卡1注册上
网络时解锁卡2
a. KeyguardUpdateMonitor.java
当卡被lock住, 会收到INTENT_VALUE_LOCKED_NETWORK, 增加判断处理
private final BroADCastReceiver mBroadcastReceiver = new
BroadcastReceiver() {
......
} else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
......
if (IccCardConstants.State.NETWORK_LOCKED == simArgs.simState) {
(1)simArgs.simId == PhoneConstants.GEMINI_SIM_1
表示卡1 插入了非Viettel卡,直接Lock screen
(2)simArgs.simId == PhoneConstants.GEMINI_SIM_2
表示卡2 有插卡
(3)如果卡1成功注册上网络,表示卡1当前插入有效卡,卡2需要解锁
int sim1Satus = mPhoneMgrEx.getSimIndicatorState
(PhoneConstants.GEMINI_SIM_1);
if(sim1Satus == PhoneConstants. SIM_INDICATOR_NORMAL)
参考FAQ12121 [SEC]在app端创建线程来解锁SIM ME lock
new simMeCheckThread(simArgs.simId, mPasswd).start();
//mPasswd为modem配置的解锁密码.
(4)如果不是,则直接Lock screen
b. Gsmphone.java
private boolean isFirstBoot = true; 定义一个变量,只有在开机第一次注册上网络的情
况下,会去解锁卡2
public void updateSimIndicateState(){
......
if (mSimIndicatorState != newState){
mSimIndicatorState = newState;
broadcastSimIndStateChangedIntent(newState);
根据newState为注册上网络的状态和getMySimId()为卡1的情况下来处理
(1) if(isFirstBoot &&( true == FeatureOption.mtk_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
卡1成功注册上网络了,调用getSimState()获取卡2状态
如果为SIM_STATE_NETWORK_LOCKED,则调用supplyNetworkDepersonalization()来解锁
卡2
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
(2) 如果卡1没有注册上网络,且卡2没有插卡的情况下Lock screen
if(isFirstBoot &&( true == FeatureOption.MTK_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& newState == PhoneConstants.SIM_INDICATOR_INVALID) {
GeminiPhone mGeminiPhone = (GeminiPhone)PhoneFactory.getDefaultPhone();
判断卡2 是否有插卡isSimInsert(PhoneConstants.GEMINI_SIM_2)
如果没有,则Lock screen
isFirstBoot = false; //确保下次在上报未注册消息,不在show界面
}
}
LOGD("updateSimIndicateState new state is " + newState);
c.在飞行模式操作后,也可以正常实现依赖关系
在Gsmphone.java中侦测 飞行模式的变化的intent
Intent.ACTION_AIRPLANE_MODE_CHANGED
boolean enabled = intent.getBooleanExtra("state", false);
如果值为false,则将最开始添加的变量 isFirstBoot = true;
如果是过期卡双卡相互依赖的需求,请参考FAQ12123 [SEC]过期卡锁卡需求-双卡相互依赖 (越
南为例)
很多运营商要求过期卡能当作是无效卡来处理。如果有依赖关系,其依赖关系不起作用.
卡2依赖卡1,如果卡1插入过期卡,卡2也要无法使用.
[SOLUTION]
过期卡是不能注册上网络的,所以判断的方法就是看是否能注册上网络。如果不能注册上,则认为是
Expired SIM Viettel.
但是因为网络环境,有效卡也有可能无法注册上网络,在当次开机会被识别为过期卡。
不过下一次开机如果能正常注册上网络,还是能识别出来是有效卡,这种case贵司要考虑清楚。
如果有其他的方式识别过期卡,还请使用其他方式具体方案来实现需求.
以越南的如下需求为例:
需求分析如下:
只有卡1 插入注册上网络的Viettel卡才能使用。其他case都不能使用
Modem端
请参考DMS文档“SIM-ME lock",配置NVRAM_EF_SML_DEFAULT
卡1 只允许Viettel卡有效, 卡2 所有卡都锁住
case 2,4,5,6,7,8 12,13,14 满足需求.
APP端
(1) 实现卡2对卡1的依赖
当卡1插入”注册上网络的Viettel卡”, 如果卡2被locked住,自行解锁。
case 1,3,15 满足需求
case 15说明:卡2依赖卡1解锁之后,卡2无法注册上网络也是无法normal use
No. SIM slot 1 SIM slot 2 Requirement
1 SIM Viettel SIM Viettel Both of SIMs working as normal
2 SIM Viettel Null SIM1 working as normal
3 SIM Viettel SIM Non-Viettel Both of SIMs working as normal
4 Null SIM Viettel Lock
5 SIM Non-Viettel SIM Viettel Lock
6 SIM Non-Viettel Null Lock
7 Null SIM Non-Viettel Lock
8 SIM Non-Viettel SIM Non-Viettel Lock
9 Expired SIM Viettel Null Lock
10 Expired SIM Viettel SIM Non-Viettel Lock
11 Expired SIM Viettel Expired SIM Viettel Lock
12 SIM Non-Viettel Expired SIM Viettel Lock
13 Null Expired SIM Viettel Lock
14 Null Null Normal as Non-SIM, able to access the main 15 SIM Viettel Expired SIM Viettel Only SIM 1 working as normal
16 Expired SIM Viettel SIM Viettel Lock
(2) Lock screen
当卡1插入”没有注册上网络的Viettel卡”, Lock screen
case 9,10,11,16 满足需求
----------------------------
获取卡的状态函数:
TelephonyManagerEx.Java getSimState(int simId) 获取卡的状态
SIM_STATE_NETWORK_LOCKED 表示当前卡被SIM ME locked
获取卡注册网络情况
KK之前版本 PhoneInterfaceManager.java getSimIndicatorStateGemini(int simId)
KK之后的版本 PhoneInterfaceManagerEx.java getSimIndicatorState(int simId)
PhoneConstants.SIM_INDICATOR_NORMAL 表示成功注册上了网络.
app端具体做法如下:
case 1: 卡1成功注册上网络之后,卡2才上报NETWORK_LOCKED, 则在keyguard中卡2上报
LOCKED时解锁卡2
case 2: 卡2上报NETWORK_LOCKED之后, 卡1才成功注册上网络,则在GSMPhone中卡1注册上
网络时解锁卡2
a. KeyguardUpdateMonitor.java
当卡被lock住, 会收到INTENT_VALUE_LOCKED_NETWORK, 增加判断处理
private final BroADCastReceiver mBroadcastReceiver = new
BroadcastReceiver() {
......
} else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
......
if (IccCardConstants.State.NETWORK_LOCKED == simArgs.simState) {
(1)simArgs.simId == PhoneConstants.GEMINI_SIM_1
表示卡1 插入了非Viettel卡,直接Lock screen
(2)simArgs.simId == PhoneConstants.GEMINI_SIM_2
表示卡2 有插卡
(3)如果卡1成功注册上网络,表示卡1当前插入有效卡,卡2需要解锁
int sim1Satus = mPhoneMgrEx.getSimIndicatorState
(PhoneConstants.GEMINI_SIM_1);
if(sim1Satus == PhoneConstants. SIM_INDICATOR_NORMAL)
参考FAQ12121 [SEC]在app端创建线程来解锁SIM ME lock
new simMeCheckThread(simArgs.simId, mPasswd).start();
//mPasswd为modem配置的解锁密码.
(4)如果不是,则直接Lock screen
b. Gsmphone.java
private boolean isFirstBoot = true; 定义一个变量,只有在开机第一次注册上网络的情
况下,会去解锁卡2
public void updateSimIndicateState(){
......
if (mSimIndicatorState != newState){
mSimIndicatorState = newState;
broadcastSimIndStateChangedIntent(newState);
根据newState为注册上网络的状态和getMySimId()为卡1的情况下来处理
(1) if(isFirstBoot &&( true == FeatureOption.mtk_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
卡1成功注册上网络了,调用getSimState()获取卡2状态
如果为SIM_STATE_NETWORK_LOCKED,则调用supplyNetworkDepersonalization()来解锁
卡2
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
(2) 如果卡1没有注册上网络,且卡2没有插卡的情况下Lock screen
if(isFirstBoot &&( true == FeatureOption.MTK_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& newState == PhoneConstants.SIM_INDICATOR_INVALID) {
GeminiPhone mGeminiPhone = (GeminiPhone)PhoneFactory.getDefaultPhone();
判断卡2 是否有插卡isSimInsert(PhoneConstants.GEMINI_SIM_2)
如果没有,则Lock screen
isFirstBoot = false; //确保下次在上报未注册消息,不在show界面
}
}
LOGD("updateSimIndicateState new state is " + newState);
c.在飞行模式操作后,也可以正常实现依赖关系
在Gsmphone.java中侦测 飞行模式的变化的intent
Intent.ACTION_AIRPLANE_MODE_CHANGED
boolean enabled = intent.getBooleanExtra("state", false);
如果值为false,则将最开始添加的变量 isFirstBoot = true;
如果是过期卡双卡相互依赖的需求,请参考FAQ12123 [SEC]过期卡锁卡需求-双卡相互依赖 (越
南为例)