立即注册
查看: 1555|回复: 0

[MTK软件经验分享] 如何将数据帐户用于应用程序(How to use data account for application)

已绑定手机
发表于 2019-5-23 18:49:13 | 显示全部楼层 |阅读模式 来自 广东省深圳市
当application在建立网络连接的时候,对于不同的sim卡不同的应用,需要用到不同的APN
[SOLUTION]
1调用datAACcount的cui
如果app觉得有必要让用户通过手动选择来显示dataaccount菜单,就需要调用到dataaccount的cui来让enduser进行选择,并使用选择之后的值来建立网络连接。
调用dataaccount的cui基本可以分为下面4步:
1.1注册appid,绑定apptpye
10Adataaccount的架构中,增加了自适应的feature,也就是在app没有指定dataaccount的ID的时候,dataaccount根据自适应原则来为app选择一个account,建立网络连接,而dataaccount选择的主要的依据就是apptype。
Samplecode如下:
kal_uint8test_app_id=0;
voiddtcnt_test_register_app_id(kal_uint8*app_id)
{
/*----------------------------------------------------------------*/
/*LocalVariables*/
/*----------------------------------------------------------------*/
cbm_app_info_structinfo;
kal_int8ret;
info.app_str_id=MENU_SETTING_TEST;
info.app_icon_id=GetRootTitleIcon(MENU_SETTING_TEST);
info.app_type=DTCNT_APPTYPE_TEST;
ret=cbm_register_app_id_with_app_info(&info,app_id);
if(ret==CBM_OK)
{
}
}
staticvoidmmi_test_dtcnt_init(void)
{
/*----------------------------------------------------------------*/
/*LocalVariables*/
/*----------------------------------------------------------------*/
dtcnt_test_register_app_id(&test_app_id);
}
其中DTCNT_APPTYPE_TEST需要定义在dtcnt_apptype_enum中,这样在定义dataaccount的时候,可以给应用指定自适应的dataaccount,也就是不选择dataaccount,让系统自己决定要使用的dataaccount的时候的ID。
mmi_test_dtcnt_init函数的调用最好写在初始化的时候,因为每个app只能注册一个appid。
1.2在代码中写入app要用的dataaccount
dataaccount是通过g_config_account_GPRS和g_config_account_csd来定义的,所以,我们需要先将app在自适应的时候要用的dataaccount的ID跟apptype进行绑定,比如app在自适应的时候需要使用cmwap来上网,就可以将DTCNT_APPTYPE_TEST写在cmwap的dataaccount对应的apptype中,如下图所示:
QQ截图20190523172830.png
1.3调用dataaccount的commonUI
10A有dataaccount的commoncui供app来使用,app仅需要调用cui_dtcnt_select_create和cui_dtcnt_select_run两个cui即可,在这之前,app也可以根据自己对dataaccount的需要,调用cui_dtcnt_select_set_param来对参数进行设置,show出自己需要的dataaccount界面。
Samplecode如下:
staticvoidmmi_test_entry_dtcnt_cui(void)
{
/*----------------------------------------------------------------*/
/*LocalVariables*/
/*----------------------------------------------------------------*/
mmi_idcaller_id,cur_id;
cui_dtcnt_select_run_struCTPara;
para.account_id=cbm_get_original_account(test_net_id);
para.AppMenuID=MENU_SETTING_SOUND_EFFECT;
para.app_id=test_app_id;
para.bearers=DATA_ACCOUNT_BEARER_GPRS|DATA_ACCOUNT_BEARER_WIFI;
para.sim_selection=CUI_DTCNT_SELECT_DUAL_SIM;
para.option=CUI_DTCNT_SELECT_SIM|CUI_DTCNT_SELECT_SIM_PROFILE;
para.type=CUI_DTCNT_SELECT_TYPE_NORMAL;
para.str_id=STR_GLOBAL_DATA_ACCOUNT;
if(mmi_frm_group_is_present(GRP_ID_SETTING_SOUND_EFFECT))
{
mmi_frm_group_close(GRP_ID_SETTING_SOUND_EFFECT);
}
mmi_frm_group_create(GRP_ID_ROOT,GRP_ID_SETTING_SOUND_EFFECT,mmi_test_dtcnt_cui_proc,NU
LL);
mmi_frm_group_enter(GRP_ID_SETTING_SOUND_EFFECT,MMI_FRM_NODE_SMART_CLOSE_FLAG);
cur_id=cui_dtcnt_select_create(GRP_ID_SETTING_SOUND_EFFECT);
cui_dtcnt_select_set_param(cur_id,¶);
cui_dtcnt_select_run(cur_id);
}
其中,para.bearers可以指定dataaccount的选择界面的连接类型,包括CSD、GPRS、WIFI等,para.option的取值可以参考cui_dtcnt_select_option_enum,比如双卡的项目,设置了
CUI_DTCNT_SELECT_SIM,就会有SIM1/SIM2的选择界面。
mmi_test_dtcnt_cui_proc函数我们在3.1.4中再来详细介绍。
执行cui_dtcnt_select_run之后就可以show出dataaccount的界面了,如下图所示:
QQ截图20190523172855.png
QQ截图20190523172911.png
1.4注册eventhandler函数
在dataaccount界面,user选择某一个dataaccount或者取消选择之后,都会有相应的event发给app,app需要添加eventhandler函数来对这些event进行相应的处理。
Samplecode如下:
mmi_retmmi_test_dtcnt_cui_proc(mmi_event_struct*param)
{
cui_dtcnt_select_event_struct*evt=(cui_dtcnt_select_event_struct*)param;
switch(evt->evt_id)
{
caseCUI_DTCNT_SELECT_EVENT_RESULT_OK:
{
test_net_id=evt->account_id;
cui_dtcnt_select_close(evt->sender_id);
break;
}
caseCUI_DTCNT_SELECT_EVENT_RESULT_CANCEL:
{
cui_dtcnt_select_close(evt->sender_id);
break;
}
caseCUI_DTCNT_SELECT_EVENT_CLOSE:
{
cui_dtcnt_select_close(evt->sender_id);
break;
}
caseCUI_DTCNT_SELECT_EVENT_RESULT_FAILED:
break;
default:
break;
}
returnMMI_RET_OK;
}
其中evt->account_id;就是选中的dataaccount的返回值,是encode之后的一个值,包括appid、simid和dataaccountid,连接网络的时候就可以直接用这个值来上网。
基本来说,通过调用dataaccount的cui来得到上网要用的dataaccount的id就可以分为上面的几步。
App如果需要这样的选择方式,可以这样来设计。
2直接使用指定的dataaccount
如果app并不需要enduser来通过界面选择dataaccount,而只需要在代码中指定dataaccount即可,可以按照下面的步骤来实现。
2.1注册appid,绑定apptpye
此步骤同1.1。
2.2在代码中写入app要用的dataaccount
此步骤同1.2。
2.3用CBM_DEFAULT_ACCT_ID作为dataaccount的ID
在创建socket的时候,如果使用CBM_DEFAULT_ACCT_ID作为dataaccount的ID,意思就是app会按照dataaccount自适应的方式匹配到的accountid来连接网络,也就是2.2中apptype所在的dataaccount对应的apn,如果此dataaccount被删除掉,则会用defaultaccount来连接网络。
如果是双卡的项目,会选择defaultaccount所在的sim卡来建立网络连接。
Samplecode如下:
kal_int8test_create_socket()
{
/*----------------------------------------------------------------*/
/*LocalVariables*/
/*----------------------------------------------------------------*/
kal_int8sd,ret;
kal_uint8val;
kal_uint32test_net_id;
/*----------------------------------------------------------------*/
/*CodeBody*/
/*----------------------------------------------------------------*/
cbm_encode_data_account_id(CBM_DEFAULT_ACCT_ID,0,test_app_id,0)
sd=soc_create(SOC_PF_INET,SOC_SOCK_STREAM,0,MOD_MMI,test_net_id);
if(sd<0)
{
returnsd;
}
val=SOC_READ|SOC_WRITE|SOC_CONNECT|SOC_CLOSE;
ret=soc_setsockopt(sd,SOC_ASYNC,&val,sizeof(val));
val=KAL_TRUE;
ret=soc_setsockopt(sd,SOC_NBIO,&val,sizeof(val));
returnsd;
}
3指定某个固定的apn对应的account
3.1查找某个apn对应的account
如果要查找某个apn对应的dataaccountid,比如cmwap,可以调用srv_dtcnt_get_acc_id_by_apn这个API,需要注意的是,这个API得到的仅仅是第一个满足条件的dataaccount的id,并不一定可以满足app其他的需求,比如proxy、sim卡的ID的信息等,app如果遇到这种case,需要自己来handle,比如设置自己要用的apn、homepage等等。
查找某apn对应的dataaccountid的Samplecode如下:
staticvoidmmi_settings_get_acc_id_by_apn(void)
{
U32acc_prof_id;
constU8test_apn[100]="cmwap";
srv_dtcnt_get_acc_id_by_apn(test_apn,&acc_prof_id);
}
如之前说述,在双卡的项目中,调用这个API得到的可能是sim1的cmwap对应的ID,而不能得到sim2对应的dataaccountid,如果app已经指定必须用某张SIM卡来连接网络,需要调用
srv_dtcnt_get_apn这个API来依次得到各个dataaccount对应apn,判断是否是自己需要的apn,如果是,再来通过srv_dtcnt_get_sim_info来判断是否是自己需要的simid,进而进行筛选。
3.2增加某个apn对应的account
如果app想要增加一个自己使用的apn,可以调用srv_dtcnt_store_add_prof来增加或者srv_dtcnt_store_update_prof来修改一个dataaccount。
增加dataaccount的samplecode如下:
staticvoidmmi_settings_add_dtcnt(void)
{
srv_dtcnt_store_prof_data_structtest_prof;
U32acc_prof_id;
srv_dtcnt_prof_gprs_struct*gprs_account;
constU8test_str[100]="cmwap";
gprs_account=OslMalloc(sizeof(srv_dtcnt_prof_gprs_struct));
memset(gprs_account,0,sizeof(srv_dtcnt_prof_gprs_struct));
gprs_account->APN=test_str;
gprs_account->prof_common_header.AccountName=test_str;
gprs_account->prof_common_header.sim_info=SRV_DTCNT_SIM_TYPE_1;
//如果需要其他属性值,按照此格式进行赋值
test_prof.prof_data=gprs_account;
test_prof.prof_fields=SRV_DTCNT_PROF_FIELD_ALL;
test_prof.prof_type=SRV_DTCNT_BEARER_GPRS;
srv_dtcnt_store_add_prof(&test_prof,&acc_prof_id);
}
4Dataaccountchange之后的处理
如果用1中的方法来进行coding,势必会面临sim卡change之后的一些处理,举例来说,如果当前插入的为CMCC的sim卡,user手动选择了chinamobile,也就是cmwap的方式,此时,关机,重新插入中国联通的sim卡,开机,那么app原来保存的CMCC的卡的选择信息实际已经不存在,这种情况下,就需要app来进行一些处理。
在目前的架构中,当dataaccount的信息发生变化后,需要app进行过注册,dataaccount便会发送相关的event(EVT_ID_SRV_DTCNT_ACCT_UPDATE_IND和EVT_ID_SRV_DTCNT_ACCT_DELETE_IND)给应用,应用来添加这些消息的handler就可以了。也就是说,app需要注册event,并进行handler。
Samplecode如下:
//注册acctchangeevent
mmi_retmmi_test_dtcnt_changes_reg_event(void*user_data)
{
/*----------------------------------------------------------------*/
/*LocalVariables*/
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/*CodeBody*/
/*----------------------------------------------------------------*/
mmi_frm_cb_reg_event(EVT_ID_SRV_DTCNT_ACCT_UPDATE_IND,mmi_test_dtcnt_update_handler,use
r_data);
mmi_frm_cb_reg_event(EVT_ID_SRV_DTCNT_ACCT_DELETE_IND,mmi_test_dtcnt_delete_handler,use
r_data);
returnMMI_RET_OK;
}
其中,mmi_test_dtcnt_update_handler和mmi_test_dtcnt_delete_handler为收到event之后的handle,收到updateevent之后,如果app用到一些dataaccount的具体信息,例如homepage、proxy等,可以进行更新,收到deleteevent之后,如果delete的account刚好为app在用的account,可以将accountid置为CBM_DEFAULT_ACCT_ID或者为CBM_INVALID_NWK_ACCT_ID或者其他app认为比较合理的方式。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表