Android手机基础信息与基础业务开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android手机基础信息与基础业务开发
摘要:本文介绍了Android手机的基础信息的获取方法和手机基础业务(语音和短消息)的开发方法,基础信息包括移动网络信息、SIM卡信息、手机状态信息等,基础业务包括短信发送和拨打号码分析等。
最后编写一段代码来实现基础信息的获取、短信的发送和手机的拨号,并通过模拟器上的操作进行部分功能验证。
一、前言
具备移动通信基础知识的读者们都知道,只要手机处于开机的状态,无论是否处于通话状态,手机和移动网络会进行很多信息交互。
在非通话状态时,手机通常会有如下动作:网络寻找和选择、用户注册、信号检测等;在通话或者数据传输时,手机和移动网络除了基本的话音数据传输之外,还要进行如信号强度监听、数据传输方向指示、小区切换、短信发送报告等操作。
二、整体介绍
当前,大多数手机平台并未开放上述底层网络的接口给开发者,例如Windows Mobile 只是规定了RIL(Radio Layer Interface)的一个标准,很多厂商没有实现该接口。
Android
图1 无线层接口结构框图
Android平台还特别添加了对3G手机的Usim卡的彩信支持。
包括链接参数、信息管理、信息通知、用户偏好设置等。
三、实例编写
3.1 基础知识
我们利用上述两个package,编写一段实际的代码,来获取手机的基础信息,并实现短信的发送和号码的拨打。
为了理解获取的参数、短信、拨号的信息,我们首先要了解一下移动通信方面的基础知识:
Cell ID:移动蜂窝小区编号。
为了能容纳大量的用户,我们可以把一个地理区域划分成许多小区。
运营商不是采用单个大功率的发射器,而是每一个小区由一个小功率的基站(base station)来提供服务。
LAC:location area code。
位置区域码。
为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。
RSSI:Received Signal Strength Indication。
接收的信号强度指示。
无线发送层概念,用来判定链接质量。
IMEI:International Mobile Equipment Identity。
国际移动设备身份码。
由15位数字组成的电子串号,它与每台手机一一对应而且该码是全世界唯一的。
SIM卡卡号:SIM卡上有20位数码。
前面6位是国家的代号,第9、10位是各省的编码,第11、12位是年号,第13位是供应商代码,第14~19位则是用户识别码,第20位是校验位。
MCC:Mobile Country Code。
移动国家号码,由3位数字组成,唯一地识别移动用户所属的国家。
我国为460。
MNC:Mobile Network Code。
移动为00,联通为01。
SMS:短消息。
一般一则短信能够容纳140字节,也就是约160个7bit的字符、或是140个8bit的字符,中文字、韩文字与日文字这些占2-byte的字符则可容纳70个。
(使用Unicode系统)
紧急呼叫:是指用手机拨打110、119、120、999之类的报警或求救号码。
这些号码的紧急性使各国都规定它们可以使用任何当时可用的网络。
在我国,就算手机在没有资费的情况下,甚至你连sim卡都没有也可以拨打这些号码。
3.2 权限设置
在这个例子中,我们利用telephony库,实现了小区信息、相邻小区信息、手机IMEI号、运营商等基础信息的读取。
为了实现上述信息的读取,我们需要在程序中添加权限(permission)。
权限用来描述是否拥有做某件事的权力,当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。
在AndroidManifest.xml 中添加权限使用语句,格式如下:
view plaincopy to clipboardprint?
1.<uses-permission android:name= />
在本文的实例中,用到了下列权限
3.3 代码编写
我们可以通过如下语句获得移动网络的基础信息:
view plaincopy to clipboardprint?
1.GsmCellLocation gcl = new GsmCellLocation(); cid = gcl.getCid(); //获
取小区号 lid = gcl.getLac(); //获取
LAC NeighboringCellInfo nbinfo =new NeighboringCellInfo(); nbid = nb
info.getCid(); //获取邻居小区号 nbrssi = nbinfo.getRssi(); //获取邻居小区信
号强
度 ServiceState ss = new ServiceState(); oname = ss.getOperatorAlpha
Long(); //获取运营商名称 onum = ss.getOperatorNumeric(); //获取运营商
编号 rm = (ss.getRoaming()? "yes":"no"); //漫游指示
通过如下语句来获得手机的基础信息:
view plaincopy to clipboardprint?
1.TelephonyManager tm = (TelephonyManager)getSystemService(TELEP
HONY_SERVICE); callstate = tm.getCallState(); //通话状
态 did = tm.getDeviceId(); //设备IMEI
号 lnum = tm.getLine1Number(); //线路1号
码 simname = tm.getSimOperatorName(); //SIM卡运营商号
码 subid = tm.getSubscriberId(); //拨号者
ID simnum = tm.getSimSerialNumber(); //SIM卡序列
号 String NetworkCountryIso = tm.getNetworkCountryIso(); //国家
号 String NetworkOperator = tm.getNetworkOperator(); //网络
号 int NetworkType = tm.getNetworkType(); //网络类
型 int simstate = tm.getSimState(); //SIM卡状态
通过在按钮响应中添加下列语句,来实现短信的发送:
view plaincopy to clipboardprint?
1.String number = et1.getText().toString(); //从文本框et1中获取接收方号
码 String msg = et2.getText().toString(); //从文本框et2中获取短信消
息 SmsManager sms = SmsManager.getDefault(); //新建短信对
象 try { PendingIntent pi = PendingIntent.getBroadcast(Sms.this, 0, ne
w Intent(), 0); //新建一个PendingIntent实例,用来传递短信发送情
况 sms.sendTextMessage(number, null, msg, pi, null); //发送短
信 Toast.makeText(Sms.this, "发送成功
",Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeTe
xt(Sms.this,"发送失败
\n"+e.getMessage(),Toast.LENGTH_LONG).show(); }
短信发送方法: public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) Throws: IllegalArgumentException ,具体参数含义如下:
在android.telephony中,可以使用号码处理工具包PhoneNumberUtils对一串数字和字符进行提取、分析、判断,该类的具体方法见图3。
图3 PhoneNumberUtils号码处理类的方法
为了通过代码实现拨号呼叫,可以采用调用Intent来跳转到拨号盘或者直接进行呼叫。
在这里用到了
ACTION_CALL和ACTION_DIAL来进行Activity的跳转。
在下面实例代码中,利用号码工具对所拨打的号码进行格式判断并呼叫,如果是紧急号码,直接呼出;如果是普通号码,跳转到拨号盘再确认呼叫:
view plaincopy to clipboardprint?
1.String number = et1.getText().toString();
2.//从文本框et1中获取接收方号码
3.if (PhoneNumberUtils.isEmergencyNumber(number))
4.{
5.Toast.makeText(Sms.this, "紧急呼叫!",Toast.LENGTH_LONG).show();
6.//判断紧急呼叫
7.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+numbe
r)));
8.//紧急呼叫时直接呼出
9.}
10.else if (PhoneNumberUtils.isGlobalPhoneNumber(number))
11.//判断无效号码
12.startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+numbe
r)));
13.//普通呼叫时调用拨号盘再确认呼叫
14.else Toast.makeText(Sms.this, "无效号码
",Toast.LENGTH_LONG).show();
四、程序测试
4.1 基础信息测试
将所获取到的手机基础信息变量在TextView上显示,得到效果如图4:
图4无呼叫时程序运行结果
由于程序在模拟器上进行测试,所以获取的小区和LAC都是-1,邻居小区信号强度是99。
在实际情况下,信号强度的取值范围是0~31,根据换算公式: dBm = -113 + 2×RSSI,RSSI为0,则信号强度为-113dbm或更小;RSSI 为31,则信号强度为-51dbm或更大。
运营商代码和手机号码都可以正常显示。
call_state值为0,代表手机处于空闲状态,Sim_state值为5,代表SIM卡处于Ready状态。
接下来我们通过手机进行拨号测试,来测试call_state的显示正确与否。
在模拟器中,我们可以使用如下拨号流程,拨号结果如图5所示:
图5 来电时屏幕显示
拨入之后,在eclipse中再次运行该程序,可以看到call_state变成了1。
在接听之后,左上角出现的小图标,可以看到call_state变成了2,见图6。
在SDK中查到call_state的各种值的定义,可以验证刚才运行结正确的。
图6 呼叫状态改变测试
4.2 短信发送测试
运行短信程序,显示界面如图7,填入收件人信息和短信内容后,点击发送,显示发送成功。
当未填写收
件人号码时,会弹出异常,显示发送错误,如图8所示。
图7 成功发送界面图8 无收件人时发送错误消息
4.3 手机呼叫测试
首先拨打一个普通号码,显示呼叫接通,如图9所示。
再拨打紧急号码会看到有紧急呼叫的提示,如图10。
最后拨打号码“abc”,我们可以看到无效号码的提示,如图11所示。
图10 紧急号码拨打
文中所有代码和程序在Android1.5平台上测试通过。
五、总结。