过期卡锁卡需求-双卡相互依赖(越南为例)
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
很多运营商要求过期卡能当作是无效卡来处理。如果有依赖关系,其依赖关系不起作用.
双卡相互依赖:
如果卡1插入运营商有效卡, 卡2能使用。卡1插入运营商过期卡,卡2插非运营商卡,卡2不能使用
如果卡2插入运营商有效卡, 卡1能使用。卡2插入运营商过期卡,卡1插非运营商卡,卡1不能使用
[SOLUTION]
过期卡是不能注册上网络的, 所以判断的方法就是看是否能注册上网络。如果不能注册上,则认为
是Expired SIM Viettel.
但是因为网络环境,有效卡也有可能无法注册上网络,在当次开机会被识别为过期卡。
不过下一次开机如果能正常注册上网络,还是能识别出来是有效卡,这种case贵司要考虑清楚。
如果有其他的方式识别过期卡,还请使用其他方式具体方案来实现需求.
以越南的如下需求为例:
需求分析如下:
Modem端
请参考DMS文档“SIM-ME lock",配置NVRAM_EF_SML_DEFAULT
卡1 只允许Viettel有效, 卡2 也只允许Viettel有效
case 1,2,4,6,7,8 9,10,11,12,13,14,15,16 满足要求
说明case 10为例:
Expired SIM Viettel虽然没有被SIM ME locked住,但是无法注册上网络,也是无法接打电话
SIM Non-Viettel直接被SIM ME locked住
APP端
SIM1 SIM2 Handset 's behavior
1 Viettel卡Viettel卡正常使用
2 Viettel卡非法卡正常使用
3 Viettel卡不插卡正常使用
4 非法卡Viettel卡正常使用
5 非法卡非法卡Lock screen
6 非法卡不插卡Lock screen
7 不插卡Viettel卡正常使用
8 不插卡非法卡Lock screen
9 不插卡不插卡正常进入IDLE界面
10 Viettel卡Viettel过期卡正常使用
11 Viettel过期卡Viettel卡正常使用
12 Viettel过期卡Viettel过期卡正常进入IDLE界面
13 Viettel过期卡非法卡Lock screen
14 Viettel过期卡不插卡正常进入IDLE界面
15 非法卡Viettel过期卡Lock screen
16 不插卡Viettel过期卡正常进入IDLE界面
实现双卡相互依赖,在卡1/卡2成功注册上网络之后,则判断另外一张卡是处于锁定状态,则自行解
锁
case 3和5 满足要求
----------------------------
获取卡的状态函数:
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: 有一张卡上报NETWORK_LOCKED,检查另外一张卡是否成功注册上网络, 如果是则需在
keyguard中解锁这张卡
case 2: 有一张成功注册上网络,检查另外一张卡是否被NETWORK_LOCKED, 如果是则需在
GSMPhone中解锁另外一张卡
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当前被SIM ME locked住;如果卡2,成功注册上网络,则解锁卡1.
(1) if(simArgs.simId == PhoneConstants.GEMINI_SIM_1) {
int sim2Satus = mPhoneMgrEx.getSimIndicatorState
(PhoneConstants.GEMINI_SIM_2);
if(sim2Satus == PhoneConstants. SIM_INDICATOR_NORMAL)
参考FAQ12121 [SEC]在app端创建线程来解锁SIM ME lock
new simMeCheckThread(simArgs.simId, mPasswd).start();
//mPasswd为modem配置的解锁密码.
(2) 卡2当前被SIM ME locked住;如果卡1,成功注册上网络,则解锁卡2.
else if(simArgs.simId == PhoneConstants.GEMINI_SIM_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配置的解锁密码.
b. Gsmphone.java
private boolean isFirstBoot = true; 定义一个变量,只有在开机第一次注册上网络的情
况下,会去解锁
public void updateSimIndicateState(){
......
if (mSimIndicatorState != newState){
mSimIndicatorState = newState;
broadcastSimIndStateChangedIntent(newState);
根据newState为注册上网络的状态和getMySimId()为当前处理的卡SimId的情况下来处理
(1) 卡1成功注册上网络了
if(isFirstBoot &&( true == FeatureOption.mtk_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
调用getSimState()获取卡2状态,如果为SIM_STATE_NETWORK_LOCKED,则调用
supplyNetworkDepersonalization()来解锁卡2
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
(2) 卡2成功注册上网络了
if(isFirstBoot &&( true == FeatureOption.MTK_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_2)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
调用getSimState()获取卡1状态,如果为SIM_STATE_NETWORK_LOCKED,则调用
supplyNetworkDepersonalization()来解锁卡1
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
LOGD("updateSimIndicateState new state is " + newState);
c.在飞行模式操作后,也可以正常实现依赖关系
在Gsmphone.java中侦测 飞行模式的变化的intent
Intent.ACTION_AIRPLANE_MODE_CHANGED
boolean enabled = intent.getBooleanExtra("state", false);
如果值为false,则将最开始添加的变量 isFirstBoot = true;
如果是过期卡卡2依赖卡1的需求,请参考FAQ12122 [SEC]过期卡锁卡需求-卡2依赖卡1 (越南为
例)
很多运营商要求过期卡能当作是无效卡来处理。如果有依赖关系,其依赖关系不起作用.
双卡相互依赖:
如果卡1插入运营商有效卡, 卡2能使用。卡1插入运营商过期卡,卡2插非运营商卡,卡2不能使用
如果卡2插入运营商有效卡, 卡1能使用。卡2插入运营商过期卡,卡1插非运营商卡,卡1不能使用
[SOLUTION]
过期卡是不能注册上网络的, 所以判断的方法就是看是否能注册上网络。如果不能注册上,则认为
是Expired SIM Viettel.
但是因为网络环境,有效卡也有可能无法注册上网络,在当次开机会被识别为过期卡。
不过下一次开机如果能正常注册上网络,还是能识别出来是有效卡,这种case贵司要考虑清楚。
如果有其他的方式识别过期卡,还请使用其他方式具体方案来实现需求.
以越南的如下需求为例:
需求分析如下:
Modem端
请参考DMS文档“SIM-ME lock",配置NVRAM_EF_SML_DEFAULT
卡1 只允许Viettel有效, 卡2 也只允许Viettel有效
case 1,2,4,6,7,8 9,10,11,12,13,14,15,16 满足要求
说明case 10为例:
Expired SIM Viettel虽然没有被SIM ME locked住,但是无法注册上网络,也是无法接打电话
SIM Non-Viettel直接被SIM ME locked住
APP端
SIM1 SIM2 Handset 's behavior
1 Viettel卡Viettel卡正常使用
2 Viettel卡非法卡正常使用
3 Viettel卡不插卡正常使用
4 非法卡Viettel卡正常使用
5 非法卡非法卡Lock screen
6 非法卡不插卡Lock screen
7 不插卡Viettel卡正常使用
8 不插卡非法卡Lock screen
9 不插卡不插卡正常进入IDLE界面
10 Viettel卡Viettel过期卡正常使用
11 Viettel过期卡Viettel卡正常使用
12 Viettel过期卡Viettel过期卡正常进入IDLE界面
13 Viettel过期卡非法卡Lock screen
14 Viettel过期卡不插卡正常进入IDLE界面
15 非法卡Viettel过期卡Lock screen
16 不插卡Viettel过期卡正常进入IDLE界面
实现双卡相互依赖,在卡1/卡2成功注册上网络之后,则判断另外一张卡是处于锁定状态,则自行解
锁
case 3和5 满足要求
----------------------------
获取卡的状态函数:
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: 有一张卡上报NETWORK_LOCKED,检查另外一张卡是否成功注册上网络, 如果是则需在
keyguard中解锁这张卡
case 2: 有一张成功注册上网络,检查另外一张卡是否被NETWORK_LOCKED, 如果是则需在
GSMPhone中解锁另外一张卡
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当前被SIM ME locked住;如果卡2,成功注册上网络,则解锁卡1.
(1) if(simArgs.simId == PhoneConstants.GEMINI_SIM_1) {
int sim2Satus = mPhoneMgrEx.getSimIndicatorState
(PhoneConstants.GEMINI_SIM_2);
if(sim2Satus == PhoneConstants. SIM_INDICATOR_NORMAL)
参考FAQ12121 [SEC]在app端创建线程来解锁SIM ME lock
new simMeCheckThread(simArgs.simId, mPasswd).start();
//mPasswd为modem配置的解锁密码.
(2) 卡2当前被SIM ME locked住;如果卡1,成功注册上网络,则解锁卡2.
else if(simArgs.simId == PhoneConstants.GEMINI_SIM_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配置的解锁密码.
b. Gsmphone.java
private boolean isFirstBoot = true; 定义一个变量,只有在开机第一次注册上网络的情
况下,会去解锁
public void updateSimIndicateState(){
......
if (mSimIndicatorState != newState){
mSimIndicatorState = newState;
broadcastSimIndStateChangedIntent(newState);
根据newState为注册上网络的状态和getMySimId()为当前处理的卡SimId的情况下来处理
(1) 卡1成功注册上网络了
if(isFirstBoot &&( true == FeatureOption.mtk_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_1)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
调用getSimState()获取卡2状态,如果为SIM_STATE_NETWORK_LOCKED,则调用
supplyNetworkDepersonalization()来解锁卡2
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
(2) 卡2成功注册上网络了
if(isFirstBoot &&( true == FeatureOption.MTK_GEMINI_SUPPORT) &&
(getMySimId() == PhoneConstants.GEMINI_SIM_2)
&& (newState == PhoneConstants.SIM_INDICATOR_NORMAL || newState ==
PhoneConstants.SIM_INDICATOR_ROAMING) )
{
调用getSimState()获取卡1状态,如果为SIM_STATE_NETWORK_LOCKED,则调用
supplyNetworkDepersonalization()来解锁卡1
isFirstBoot = false; //确保下次注册网络不会引起解锁操作
}
LOGD("updateSimIndicateState new state is " + newState);
c.在飞行模式操作后,也可以正常实现依赖关系
在Gsmphone.java中侦测 飞行模式的变化的intent
Intent.ACTION_AIRPLANE_MODE_CHANGED
boolean enabled = intent.getBooleanExtra("state", false);
如果值为false,则将最开始添加的变量 isFirstBoot = true;
如果是过期卡卡2依赖卡1的需求,请参考FAQ12122 [SEC]过期卡锁卡需求-卡2依赖卡1 (越南为
例)