手机号码不是所有的都能获取。只是有一部分可以拿到。这个是由于移动运营商没有把手机号码的数据写入到sim卡中.SIM卡只有唯一的编号,供网络与设 备识别那就是IMSI号码,手机的信号也可以说是通过这个号码在网络中传递的,并不是手机号码。试想,你的SIM丢失后,补办一张新的会换号码吗?是不会 的.就是因为在你的手机号码对应的IMSI号 在移动运营商中被修改成新SIM卡的IMSI号码。
那么手机号为什么有的就能显示呢?
这个就像是一个变量,当移动运营商为它赋值了,它自然就会有值。不赋值自然为空。
对于移动的用户,手机号码(MDN)保存在运营商的服务器中,而不是保存在SIM卡里。SIM卡只保留了IMSI和一些验证信息。手机每次入网注册的时 候,都会以短信的形式将IMSI及验证信息上传到运营商的服务器,服务器在完成注册动作之后,会以短信的形式将注册的结果下发到手机里。下发的内容会因条 件不同而不同。
如果服务器在下发的短信中,不包含手机的号码,手机是无法取得电话号码。如果短信中包含了号码,手机才会将其缓存,以备他用.此外,对于其他运行商的SIM卡或者UIM卡,MDN有可能保存在UIM卡中。100%能够取得本机号码不太可能。
移动神州行,联通的卡是可以取到的.动感地带的取不到.别的卡还没有试过.
能够读取SIM卡号的话应该有前提.那就是SIM卡已经写入了本机号码,不然是无法读取的。
具体处理代码:(程序在模拟器上无法实现,必须连接手机)
//创建电话管理
TelephonyManager tm = (TelephonyManager)
//与手机建立连接
activity.getSystemService(Context.TELEPHONY_SERVICE);
双卡双待手机的原理
手机通讯发展到一定程度之后,很多用户希望拥有或已经拥用多个手机电话号码,特别是针对那些经常需要出差,需要经常切换SIM卡的商务人士而言,其迫切希望能将自己的手机承载多个电话号码, 根据市场上的这一需求,能同时支持两张SIM卡的手机也应运而生.
早期的多卡手机虽然能够同时接两张SIM卡,但实际上当前可用的只有一张,由 硬件电路来实现两张卡的切换,一般在开机时选择,因为协议栈的影响,一般在工作状态中不能实现两张SIM卡的动态切换,如果切换一般需要重新启动手机系 统.(主要是启动手机协议栈/上层软件等等),此时的手机被称为双卡单待系统.
双卡单待系统只拥有一套RF,一套BaseBand,一套协议栈.
因为双卡单待系统实际有用的只有一个号码,造成另外一个号码不能待机,这就大大影响了其实际推广, 其实用性也大打折扣.一种折衷的方案是采用移动运营商提供的呼叫转移以及来电秘书服务保证另外一个号码不会丢失呼叫等信息.
正是因为单待手机的一些限制,双卡双待手机才根据市场需求登上市场.
在此简单介绍一下双模手机的概念,因为目前两大移动运营商拥有GSM网络和CDMA网络,其协议实现有很大的不同,因此很多手机或者只支持GSM,或者只 支持CDMA,双模手机就是可以支持GSM/CDMA两种网络的手机,在此不做详细介绍,下面主要介绍的还是以GSM网络为准.
双卡双待系统克服了以往单待手机的局限性,其可以实现两张SIM卡的同时待机,类似同时具备两部手机,显然实用性得到大大提高.
早期的双卡双待机,实际上是拥有两套系统, 两套RF/两套BaseBand/两套协议栈,拥有两套系统的
双卡双待手机也可以称之为真正的双卡双待手机,其有一个最大的特点,也就是一个手机上的两个号码可以互相拨号.这也是判断其是否为真正双卡双待手机的唯一条件.
采用两套系统的双卡双待手机确实可以完成两套手机的真正同时待机及通话,也可以称之为双卡双待双通系统,但因为是增加了两套RF/两套BaseBand /两套协议栈软件, 成本增加了很多,并且相应的耗电量也大大增加了, 因为有两套硬件设备,手机的体积也随之增大.对于RF而言,因为存在同频干扰问题,一般是将一个RF设计在手机顶端,另外一个设计在手机末端,以尽量减少 干扰.两根天线之间的距离一般必须大于100毫米.
正是因为存在同频干扰等问题,设计出来的双卡双待手机性能方面的一个重要指标就是信号质量问题,另外还需要解 决的就是电源管理冲突问题,功耗问题以及软件协同工作问题,因为是两套协议栈在并行工作,承载协议栈的上层OS/DSP/CPU等都比单套系统时增加了一 倍的工作负载.
后期出现的双卡双待手机多称为双卡双待单通系统,其相比上面的两套系统而言,只使用了一套RF,一套 BaseBand,因为上层协议栈需要协同工作,因此原先的两套独立运行的协议栈需要密切整合,实际操作将更加复杂化,有可能由一套协议栈软件来实现该双 卡双待效果.(因为两个SIM卡, 或者说两套系统并不能够真正并行运行,某个特定的物理时隙只能分配给其中的某一个号码, 因此完全用一套协议栈来实现是很有可能的,实际处理当然并非那么简单)
该双卡双待方案并非真正意义上的双卡双待,但其相比上面的系统有很大优势:
1. 减少了硬件成本,只使用一套RF/BaseBand
2. 减少了体积
3. 不存在同频干扰问题
4. 更低的功耗
该方案虽然不能实现双通,但大部分情况下,两个手机只要不是同时通话,都可以正常待机并接听电话,同上面真正双卡双待手机的使用效果差别并不是很大.并且一个手机的两个号码实现互拨也没有实际意义.
下面主要就双卡双待单通方案谈谈其可能的工作原理,目前市场上采用单芯片双卡双待方案的手机估计都属于此范畴. (因为水平有限,不能保证推测的工作原理完全正确,仅供大家参考)
目前市场上主要的双卡双待单通方案主要集中在MTK和展讯的方案上,其中展讯的方案从其宣传而言,应该有更好的性能和更高的双卡接通率.
一般双卡双待单通主要是针对相同运营商的两个SIM卡而言的,这样,因为是相同的运营商,其可以实现小区共享,因为两个卡可以同时驻留到相同的小区,这样 SI信息可以实现共享.也就是说,只需要解析一次BCCH就可以了.当出现位置更新等阶段性任务时,可以分开时间段来执行,或者另外一个SIM卡申请信道 时,如果所分配的信道和当前卡上已分配的信道发生冲突时,可以重新申请信道.因为是同一小区,如果是相同频点,一般分配的物理信道是不同的.如果是不同频 点,因为 SDCCH/8+SACCH/C8 可以分配的专用信道一共有8个, 因此出现冲突的机率也并非很大.
需要注意的是,因为协议规定,RF发射和接收之间必须间隔1到2个时隙, (因为RF发射需要占用上一时隙的Guard-Period时间, 并不能对邻近物理信道造成干扰), 因此实际处理两个SIM卡的动作时需要保证安全的时间间隔.
当处理两个SIM卡的寻呼/通话信息时,只需要同时检测相应块上的PCH信息即可.通道申请和专用信道上的处理流程可以参考前面的论述.当其中一个卡正在通话时,一般情况下,此时上层软件可以停掉另外一张卡的动作,其通话请求信息可以利用
移 动运营商提供的呼叫转移以及来电秘书服务等保证信息不被丢失.当所分配的TCH物理信道和TS0物理信道有安全的时间间隔时,例如分配的TCH物理信道为 TS3,此时上层软件可以完全不关闭另外一张卡的动作,可以继续解析其相对应的PCH信息,并进而利用通道申请等动作了解是否有电话拨入等动作,当然如果 通话过程中还需要检测另一张卡的动作将会使协议栈和BaseBand的实际工作流程更为复杂.
当所分配的TCH信道为TS0或TS7时, 此时物理上的时间已经重合,其中一张卡在通话时,不能够检测另外一张卡的PCH等信息,即便利用26复帧中的IDLE帧也不能满足需求,因为PCH信道需 要连续的4个Frame才能组成一个信息块.可能的方法只能是偷取TCH帧的时间.否则的话,将不能保证另外一个电话的拨入动作.
展讯方案所宣传的可以大大提高两卡的接通率,不知是否是采用偷TCH帧的方式还是仅仅是商业上的运作或者是有其独特的解决方案,并且其宣称可以同时支持两 个运营商的卡,因为如果是不同运营商的卡,其对应的频率范围也是不同的,上面提到的小区共享等动作都是不可能实现的,其出现冲突的几率会更大.
因为物理上的时间发生重合时,针对一套RF,不可能完成两个频点的动作的, 所以估计展讯方案可能是采用偷取TCH帧的方式来解决时间重合问题.(当然如果本身两个SIM卡的工作时隙具有安全的时间间隔时,两个SIM卡可以同时工作)
展讯宣称的可以同时支持不同运营商的卡,其可能的工作冲突会更大,当两个不同网的卡的TS0时间冲突时,解析BCCH上的SI都不可能同时 进行,上层协议栈可以采用不同TC周期来解析SI的方式来实现SI的解析动作,虽然可以实现,但和协议栈所要求的在1个TC周期完成的标准相冲突.
the maximum time allowed to read the BCCH data, when being synchronized to a BCCH carrier, is 1.9 s or equal to the scheduling period for the BCCH data, whichever is greater (see 3GPP TS 05.02).
1.9s ( 8 * 51 * FN = 8 * 60/13 ms * 51 = 1.88 s )
另外其宣称的在通话过程中可以大大提高两个卡的接通率,估计也是采用偷取TCH帧的方式来实现的,因为每个26复帧中的语音信息块是采用块间交织和块内交 织的方式, 当直接偷走其中间连续的4个Frame时,估计对当前通话质量有一定的损害,并且其要实现对不同运营商的卡的支持,其协议栈和BaseBand的工作将比 上面介绍的方式更加复杂.
//获取手机号码
String phoneId = tm.getLine1Number();
//记得在manifest file中添加
<uses-permission
android:name="android.permission.READ_PHONE_STATE" />