最近比较空闲,一直在优化之前的移植代码。之前拨号接口一直有那么点问题,所以今天重新看了下IAP相关的代码,总结如下。
一般程序在使用RConnection进行拨号连接时,默认会弹出一个接入点列表框,让你选择指定的IAP进行拨号。现在很流行自绘UI,这个系统列表框就会与程序显得有点格格不入,同时也考虑用户体验的问题,有些程序就希望将这个列表框隐藏起来。想要隐藏起来,就需要程序去遍历手机里的IAP列表,并选择其中一个的IAP ID值,然后进行拨号。
遍历有两种方法,第一种是访问数据库CommDb,需要打开IAP表,其中的COMMDB_NAME字段是连接名字,COMMDB_ID即拨号所需的IAP ID值;第二种是用一个封装好的类CApSelect,ISP类型和Bearer类型都设置为All Type,就可以调用CApSelect::Name()和CApSelect::Uid()获取每个IAP的名字和ID值。
获取手机上的所有IAP之后,接下来就是选择具体哪一个IAP的问题了。一般拨号分cmwap和cmnet两种,wifi不在本文讨论范围之内。我看了下CApSelect提供的方法,只能获取IAP的ISP类型和Bearer类型,虽然一直没弄清楚这两个值具体是什么用的,但经测试貌似是不能作为区分cmwap和cmnet的,那么最终还是要访问数据库的。
回顾一下代码创建一个IAP的过程,cmnet和cmwap都会创建好几个相关的表,唯一区别在于cmwap需要在PROXIES表里相关的记录中添加代理地址(10.0.0.172)和端口(80)等信息,cmnet则需要删除PROXIES表中那条相关的记录。我看了了很多网上搜索IAP的代码,基本都是两种:1、搜索IAP表中的COMMDB_NAME字段;2、搜索OUTGOING_GPRS表中的GPRS_APN字段,然后通过IAP的IAP_SERVICE字段和OUTGOING_GPRS的COMMDB_ID字段来关联两个表。一个是连接的名称,一个是接入点的名称,看其中是否有关键字“cmnet”和“cmwap”。但事实上这两个值并不是固定的,用户完全可以在设置-连接-接入点中将这两个值改写成任意的值。所以想靠名字来区分是非常不可靠的做法。有一种思路,是根据创建IAP时的不同处入手,看和OUTGOING_GPRS里每条记录所关联的PROXIES表中的记录是否存在,来区分,这个暂时还没有测试过。
还有一种做法,就是当搜索不到名为“cmnet”和“cmwap”的IAP时,程序自动创建一个,这样以后的连接都可以使用这个IAP来拨号了。当然你得保证你的创建IAP程序是正确的。
不过话说回来,我觉得最好的方法还是由用户自己来选择接入点,也最保险。我看了下其他四款软件,其中UcWeb、QQ2010、酷伴,拨号时都是会弹出接入点列表框的,而QQ游戏大厅的做法更好,列表框也是自绘的,这样也统一了程序UI风格。
创建IAP的代码可以参考这个帖子:
http://www.devdiv.net/bbs/viewthread.php?tid=24300
至于遍历代码参考这个:
http://hi.baidu.com/marktian/blog/item/e7faa0f0bec0eea7a50f52d0.html