1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.telephony; 18 19 import android.annotation.SdkConstant; 20 import android.annotation.SdkConstant.SdkConstantType; 21 import android.content.Context; 22 import android.os.Bundle; 23 import android.os.RemoteException; 24 import android.os.ServiceManager; 25 import android.os.SystemProperties; 26 27 import com.android.internal.telephony.IPhoneSubInfo; 28 import com.android.internal.telephony.ITelephony; 29 import com.android.internal.telephony.ITelephonyRegistry; 30 import com.android.internal.telephony.Phone; 31 import com.android.internal.telephony.PhoneFactory; 32 import com.android.internal.telephony.TelephonyProperties; 33 34 import java.util.List; 35 36 /** 37 * Provides access to information about the telephony services on 38 * the device. Applications can use the methods in this class to 39 * determine telephony services and states, as well as to access some 40 * types of subscriber information. Applications can also register 41 * a listener to receive notification of telephony state changes. 42 * <p> 43 * You do not instantiate this class directly; instead, you retrieve 44 * a reference to an instance through 45 * {@link android.content.Context#getSystemService 46 * Context.getSystemService(Context.TELEPHONY_SERVICE)}. 47 * <p> 48 * Note that access to some telephony information is 49 * permission-protected. Your application cannot access the protected 50 * information unless it has the appropriate permissions declared in 51 * its manifest file. Where permissions apply, they are noted in the 52 * the methods through which you access the protected information. 53 */ 54 public class TelephonyManager { 55 private static final String TAG = "TelephonyManager"; 56 57 private static Context sContext; 58 private static ITelephonyRegistry sRegistry; 59 60 /** @hide */ 61 public TelephonyManager(Context context) { 62 if (sContext == null) { 63 Context appContext = context.getApplicationContext(); 64 if (appContext != null) { 65 sContext = appContext; 66 } else { 67 sContext = context; 68 } 69 70 sRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( 71 "telephony.registry")); 72 } 73 } 74 75 /** @hide */ 76 private TelephonyManager() { 77 } 78 79 private static TelephonyManager sInstance = new TelephonyManager(); 80 81 /** @hide 82 /* @deprecated - use getSystemService as described above */ 83 public static TelephonyManager getDefault() { 84 return sInstance; 85 } 86 87 /** {@hide} */ 88 public static TelephonyManager from(Context context) { 89 return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 90 } 91 92 // 93 // Broadcast Intent actions 94 // 95 96 /** 97 * Broadcast intent action indicating that the call state (cellular) 98 * on the device has changed. 99 * 100 * <p> 101 * The {@link #EXTRA_STATE} extra indicates the new call state. 102 * If the new state is RINGING, a second extra 103 * {@link #EXTRA_INCOMING_NUMBER} provides the incoming phone number as 104 * a String. 105 * 106 * <p class="note"> 107 * Requires the READ_PHONE_STATE permission. 108 * 109 * <p class="note"> 110 * This was a {@link android.content.Context#sendStickyBroadcast sticky} 111 * broadcast in version 1.0, but it is no longer sticky. 112 * Instead, use {@link #getCallState} to synchronously query the current call state. 113 * 114 * @see #EXTRA_STATE 115 * @see #EXTRA_INCOMING_NUMBER 116 * @see #getCallState 117 */ 118 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 119 public static final String ACTION_PHONE_STATE_CHANGED = 120 "android.intent.action.PHONE_STATE"; 121 122 /** 123 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 124 * for a String containing the new call state. 125 * 126 * @see #EXTRA_STATE_IDLE 127 * @see #EXTRA_STATE_RINGING 128 * @see #EXTRA_STATE_OFFHOOK 129 * 130 * <p class="note"> 131 * Retrieve with 132 * {@link android.content.Intent#getStringExtra(String)}. 133 */ 134 public static final String EXTRA_STATE = Phone.STATE_KEY; 135 136 /** 137 * Value used with {@link #EXTRA_STATE} corresponding to 138 * {@link #CALL_STATE_IDLE}. 139 */ 140 public static final String EXTRA_STATE_IDLE = Phone.State.IDLE.toString(); 141 142 /** 143 * Value used with {@link #EXTRA_STATE} corresponding to 144 * {@link #CALL_STATE_RINGING}. 145 */ 146 public static final String EXTRA_STATE_RINGING = Phone.State.RINGING.toString(); 147 148 /** 149 * Value used with {@link #EXTRA_STATE} corresponding to 150 * {@link #CALL_STATE_OFFHOOK}. 151 */ 152 public static final String EXTRA_STATE_OFFHOOK = Phone.State.OFFHOOK.toString(); 153 154 /** 155 * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast 156 * for a String containing the incoming phone number. 157 * Only valid when the new call state is RINGING. 158 * 159 * <p class="note"> 160 * Retrieve with 161 * {@link android.content.Intent#getStringExtra(String)}. 162 */ 163 public static final String EXTRA_INCOMING_NUMBER = "incoming_number"; 164 165 166 // 167 // 168 // Device Info 169 // 170 // 171 172 /** 173 * Returns the software version number for the device, for example, 174 * the IMEI/SV for GSM phones. Return null if the software version is 175 * not available. 176 * 177 * <p>Requires Permission: 178 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 179 */ 180 public String getDeviceSoftwareVersion() { 181 try { 182 return getSubscriberInfo().getDeviceSvn(); 183 } catch (RemoteException ex) { 184 return null; 185 } catch (NullPointerException ex) { 186 return null; 187 } 188 } 189 190 /** 191 * Returns the unique device ID, for example, the IMEI for GSM and the MEID 192 * or ESN for CDMA phones. Return null if device ID is not available. 193 * 194 * <p>Requires Permission: 195 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 196 */ 197 public String getDeviceId() { 198 try { 199 return getSubscriberInfo().getDeviceId(); 200 } catch (RemoteException ex) { 201 return null; 202 } catch (NullPointerException ex) { 203 return null; 204 } 205 } 206 207 /** 208 * Returns the current location of the device. 209 * Return null if current location is not available. 210 * 211 * <p>Requires Permission: 212 * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or 213 * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION}. 214 */ 215 public CellLocation getCellLocation() { 216 try { 217 Bundle bundle = getITelephony().getCellLocation(); 218 CellLocation cl = CellLocation.newFromBundle(bundle); 219 if (cl.isEmpty()) 220 return null; 221 return cl; 222 } catch (RemoteException ex) { 223 return null; 224 } catch (NullPointerException ex) { 225 return null; 226 } 227 } 228 229 /** 230 * Enables location update notifications. {@link PhoneStateListener#onCellLocationChanged 231 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 232 * 233 * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES 234 * CONTROL_LOCATION_UPDATES} 235 * 236 * @hide 237 */ 238 public void enableLocationUpdates() { 239 try { 240 getITelephony().enableLocationUpdates(); 241 } catch (RemoteException ex) { 242 } catch (NullPointerException ex) { 243 } 244 } 245 246 /** 247 * Disables location update notifications. {@link PhoneStateListener#onCellLocationChanged 248 * PhoneStateListener.onCellLocationChanged} will be called on location updates. 249 * 250 * <p>Requires Permission: {@link android.Manifest.permission#CONTROL_LOCATION_UPDATES 251 * CONTROL_LOCATION_UPDATES} 252 * 253 * @hide 254 */ 255 public void disableLocationUpdates() { 256 try { 257 getITelephony().disableLocationUpdates(); 258 } catch (RemoteException ex) { 259 } catch (NullPointerException ex) { 260 } 261 } 262 263 /** 264 * Returns the neighboring cell information of the device. 265 * 266 * @return List of NeighboringCellInfo or null if info unavailable. 267 * 268 * <p>Requires Permission: 269 * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES} 270 */ 271 public List<NeighboringCellInfo> getNeighboringCellInfo() { 272 try { 273 return getITelephony().getNeighboringCellInfo(); 274 } catch (RemoteException ex) { 275 return null; 276 } catch (NullPointerException ex) { 277 return null; 278 } 279 } 280 281 /** No phone radio. */ 282 public static final int PHONE_TYPE_NONE = Phone.PHONE_TYPE_NONE; 283 /** Phone radio is GSM. */ 284 public static final int PHONE_TYPE_GSM = Phone.PHONE_TYPE_GSM; 285 /** Phone radio is CDMA. */ 286 public static final int PHONE_TYPE_CDMA = Phone.PHONE_TYPE_CDMA; 287 /** Phone is via SIP. */ 288 public static final int PHONE_TYPE_SIP = Phone.PHONE_TYPE_SIP; 289 290 /** 291 * Returns the current phone type. 292 * TODO: This is a last minute change and hence hidden. 293 * 294 * @see #PHONE_TYPE_NONE 295 * @see #PHONE_TYPE_GSM 296 * @see #PHONE_TYPE_CDMA 297 * @see #PHONE_TYPE_SIP 298 * 299 * {@hide} 300 */ 301 public int getCurrentPhoneType() { 302 try{ 303 ITelephony telephony = getITelephony(); 304 if (telephony != null) { 305 return telephony.getActivePhoneType(); 306 } else { 307 // This can happen when the ITelephony interface is not up yet. 308 return getPhoneTypeFromProperty(); 309 } 310 } catch (RemoteException ex) { 311 // This shouldn't happen in the normal case, as a backup we 312 // read from the system property. 313 return getPhoneTypeFromProperty(); 314 } catch (NullPointerException ex) { 315 // This shouldn't happen in the normal case, as a backup we 316 // read from the system property. 317 return getPhoneTypeFromProperty(); 318 } 319 } 320 321 /** 322 * Returns a constant indicating the device phone type. This 323 * indicates the type of radio used to transmit voice calls. 324 * 325 * @see #PHONE_TYPE_NONE 326 * @see #PHONE_TYPE_GSM 327 * @see #PHONE_TYPE_CDMA 328 * @see #PHONE_TYPE_SIP 329 */ 330 public int getPhoneType() { 331 if (!isVoiceCapable()) { 332 return PHONE_TYPE_NONE; 333 } 334 return getCurrentPhoneType(); 335 } 336 337 private int getPhoneTypeFromProperty() { 338 int type = 339 SystemProperties.getInt(TelephonyProperties.CURRENT_ACTIVE_PHONE, 340 getPhoneTypeFromNetworkType()); 341 return type; 342 } 343 344 private int getPhoneTypeFromNetworkType() { 345 // When the system property CURRENT_ACTIVE_PHONE, has not been set, 346 // use the system property for default network type. 347 // This is a fail safe, and can only happen at first boot. 348 int mode = SystemProperties.getInt("ro.telephony.default_network", -1); 349 if (mode == -1) 350 return PHONE_TYPE_NONE; 351 return PhoneFactory.getPhoneType(mode); 352 } 353 // 354 // 355 // Current Network 356 // 357 // 358 359 /** 360 * Returns the alphabetic name of current registered operator. 361 * <p> 362 * Availability: Only when user is registered to a network. Result may be 363 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 364 * on a CDMA network). 365 */ 366 public String getNetworkOperatorName() { 367 return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA); 368 } 369 370 /** 371 * Returns the numeric name (MCC+MNC) of current registered operator. 372 * <p> 373 * Availability: Only when user is registered to a network. Result may be 374 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 375 * on a CDMA network). 376 */ 377 public String getNetworkOperator() { 378 return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC); 379 } 380 381 /** 382 * Returns true if the device is considered roaming on the current 383 * network, for GSM purposes. 384 * <p> 385 * Availability: Only when user registered to a network. 386 */ 387 public boolean isNetworkRoaming() { 388 return "true".equals(SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING)); 389 } 390 391 /** 392 * Returns the ISO country code equivalent of the current registered 393 * operator's MCC (Mobile Country Code). 394 * <p> 395 * Availability: Only when user is registered to a network. Result may be 396 * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if 397 * on a CDMA network). 398 */ 399 public String getNetworkCountryIso() { 400 return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY); 401 } 402 403 /** Network type is unknown */ 404 public static final int NETWORK_TYPE_UNKNOWN = 0; 405 /** Current network is GPRS */ 406 public static final int NETWORK_TYPE_GPRS = 1; 407 /** Current network is EDGE */ 408 public static final int NETWORK_TYPE_EDGE = 2; 409 /** Current network is UMTS */ 410 public static final int NETWORK_TYPE_UMTS = 3; 411 /** Current network is CDMA: Either IS95A or IS95B*/ 412 public static final int NETWORK_TYPE_CDMA = 4; 413 /** Current network is EVDO revision 0*/ 414 public static final int NETWORK_TYPE_EVDO_0 = 5; 415 /** Current network is EVDO revision A*/ 416 public static final int NETWORK_TYPE_EVDO_A = 6; 417 /** Current network is 1xRTT*/ 418 public static final int NETWORK_TYPE_1xRTT = 7; 419 /** Current network is HSDPA */ 420 public static final int NETWORK_TYPE_HSDPA = 8; 421 /** Current network is HSUPA */ 422 public static final int NETWORK_TYPE_HSUPA = 9; 423 /** Current network is HSPA */ 424 public static final int NETWORK_TYPE_HSPA = 10; 425 /** Current network is iDen */ 426 public static final int NETWORK_TYPE_IDEN = 11; 427 /** Current network is EVDO revision B*/ 428 public static final int NETWORK_TYPE_EVDO_B = 12; 429 /** Current network is LTE */ 430 public static final int NETWORK_TYPE_LTE = 13; 431 /** Current network is eHRPD */ 432 public static final int NETWORK_TYPE_EHRPD = 14; 433 /** Current network is HSPA+ */ 434 public static final int NETWORK_TYPE_HSPAP = 15; 435 436 /** 437 * Returns a constant indicating the radio technology (network type) 438 * currently in use on the device for data transmission. 439 * @return the network type 440 * 441 * @see #NETWORK_TYPE_UNKNOWN 442 * @see #NETWORK_TYPE_GPRS 443 * @see #NETWORK_TYPE_EDGE 444 * @see #NETWORK_TYPE_UMTS 445 * @see #NETWORK_TYPE_HSDPA 446 * @see #NETWORK_TYPE_HSUPA 447 * @see #NETWORK_TYPE_HSPA 448 * @see #NETWORK_TYPE_CDMA 449 * @see #NETWORK_TYPE_EVDO_0 450 * @see #NETWORK_TYPE_EVDO_A 451 * @see #NETWORK_TYPE_EVDO_B 452 * @see #NETWORK_TYPE_1xRTT 453 * @see #NETWORK_TYPE_IDEN 454 * @see #NETWORK_TYPE_LTE 455 * @see #NETWORK_TYPE_EHRPD 456 * @see #NETWORK_TYPE_HSPAP 457 */ 458 public int getNetworkType() { 459 try{ 460 ITelephony telephony = getITelephony(); 461 if (telephony != null) { 462 return telephony.getNetworkType(); 463 } else { 464 // This can happen when the ITelephony interface is not up yet. 465 return NETWORK_TYPE_UNKNOWN; 466 } 467 } catch(RemoteException ex) { 468 // This shouldn't happen in the normal case 469 return NETWORK_TYPE_UNKNOWN; 470 } catch (NullPointerException ex) { 471 // This could happen before phone restarts due to crashing 472 return NETWORK_TYPE_UNKNOWN; 473 } 474 } 475 476 /** Unknown network class. {@hide} */ 477 public static final int NETWORK_CLASS_UNKNOWN = 0; 478 /** Class of broadly defined "2G" networks. {@hide} */ 479 public static final int NETWORK_CLASS_2_G = 1; 480 /** Class of broadly defined "3G" networks. {@hide} */ 481 public static final int NETWORK_CLASS_3_G = 2; 482 /** Class of broadly defined "4G" networks. {@hide} */ 483 public static final int NETWORK_CLASS_4_G = 3; 484 485 /** 486 * Return general class of network type, such as "3G" or "4G". In cases 487 * where classification is contentious, this method is conservative. 488 * 489 * @hide 490 */ 491 public static int getNetworkClass(int networkType) { 492 switch (networkType) { 493 case NETWORK_TYPE_GPRS: 494 case NETWORK_TYPE_EDGE: 495 case NETWORK_TYPE_CDMA: 496 case NETWORK_TYPE_1xRTT: 497 case NETWORK_TYPE_IDEN: 498 return NETWORK_CLASS_2_G; 499 case NETWORK_TYPE_UMTS: 500 case NETWORK_TYPE_EVDO_0: 501 case NETWORK_TYPE_EVDO_A: 502 case NETWORK_TYPE_HSDPA: 503 case NETWORK_TYPE_HSUPA: 504 case NETWORK_TYPE_HSPA: 505 case NETWORK_TYPE_EVDO_B: 506 case NETWORK_TYPE_EHRPD: 507 case NETWORK_TYPE_HSPAP: 508 return NETWORK_CLASS_3_G; 509 case NETWORK_TYPE_LTE: 510 return NETWORK_CLASS_4_G; 511 default: 512 return NETWORK_CLASS_UNKNOWN; 513 } 514 } 515 516 /** 517 * Returns a string representation of the radio technology (network type) 518 * currently in use on the device. 519 * @return the name of the radio technology 520 * 521 * @hide pending API council review 522 */ 523 public String getNetworkTypeName() { 524 return getNetworkTypeName(getNetworkType()); 525 } 526 527 /** {@hide} */ 528 public static String getNetworkTypeName(int type) { 529 switch (type) { 530 case NETWORK_TYPE_GPRS: 531 return "GPRS"; 532 case NETWORK_TYPE_EDGE: 533 return "EDGE"; 534 case NETWORK_TYPE_UMTS: 535 return "UMTS"; 536 case NETWORK_TYPE_HSDPA: 537 return "HSDPA"; 538 case NETWORK_TYPE_HSUPA: 539 return "HSUPA"; 540 case NETWORK_TYPE_HSPA: 541 return "HSPA"; 542 case NETWORK_TYPE_CDMA: 543 return "CDMA"; 544 case NETWORK_TYPE_EVDO_0: 545 return "CDMA - EvDo rev. 0"; 546 case NETWORK_TYPE_EVDO_A: 547 return "CDMA - EvDo rev. A"; 548 case NETWORK_TYPE_EVDO_B: 549 return "CDMA - EvDo rev. B"; 550 case NETWORK_TYPE_1xRTT: 551 return "CDMA - 1xRTT"; 552 case NETWORK_TYPE_LTE: 553 return "LTE"; 554 case NETWORK_TYPE_EHRPD: 555 return "CDMA - eHRPD"; 556 case NETWORK_TYPE_IDEN: 557 return "iDEN"; 558 case NETWORK_TYPE_HSPAP: 559 return "HSPA+"; 560 default: 561 return "UNKNOWN"; 562 } 563 } 564 565 // 566 // 567 // SIM Card 568 // 569 // 570 571 /** SIM card state: Unknown. Signifies that the SIM is in transition 572 * between states. For example, when the user inputs the SIM pin 573 * under PIN_REQUIRED state, a query for sim status returns 574 * this state before turning to SIM_STATE_READY. */ 575 public static final int SIM_STATE_UNKNOWN = 0; 576 /** SIM card state: no SIM card is available in the device */ 577 public static final int SIM_STATE_ABSENT = 1; 578 /** SIM card state: Locked: requires the user's SIM PIN to unlock */ 579 public static final int SIM_STATE_PIN_REQUIRED = 2; 580 /** SIM card state: Locked: requires the user's SIM PUK to unlock */ 581 public static final int SIM_STATE_PUK_REQUIRED = 3; 582 /** SIM card state: Locked: requries a network PIN to unlock */ 583 public static final int SIM_STATE_NETWORK_LOCKED = 4; 584 /** SIM card state: Ready */ 585 public static final int SIM_STATE_READY = 5; 586 587 /** 588 * @return true if a ICC card is present 589 */ 590 public boolean hasIccCard() { 591 try { 592 return getITelephony().hasIccCard(); 593 } catch (RemoteException ex) { 594 // Assume no ICC card if remote exception which shouldn't happen 595 return false; 596 } catch (NullPointerException ex) { 597 // This could happen before phone restarts due to crashing 598 return false; 599 } 600 } 601 602 /** 603 * Returns a constant indicating the state of the 604 * device SIM card. 605 * 606 * @see #SIM_STATE_UNKNOWN 607 * @see #SIM_STATE_ABSENT 608 * @see #SIM_STATE_PIN_REQUIRED 609 * @see #SIM_STATE_PUK_REQUIRED 610 * @see #SIM_STATE_NETWORK_LOCKED 611 * @see #SIM_STATE_READY 612 */ 613 public int getSimState() { 614 String prop = SystemProperties.get(TelephonyProperties.PROPERTY_SIM_STATE); 615 if ("ABSENT".equals(prop)) { 616 return SIM_STATE_ABSENT; 617 } 618 else if ("PIN_REQUIRED".equals(prop)) { 619 return SIM_STATE_PIN_REQUIRED; 620 } 621 else if ("PUK_REQUIRED".equals(prop)) { 622 return SIM_STATE_PUK_REQUIRED; 623 } 624 else if ("NETWORK_LOCKED".equals(prop)) { 625 return SIM_STATE_NETWORK_LOCKED; 626 } 627 else if ("READY".equals(prop)) { 628 return SIM_STATE_READY; 629 } 630 else { 631 return SIM_STATE_UNKNOWN; 632 } 633 } 634 635 /** 636 * Returns the MCC+MNC (mobile country code + mobile network code) of the 637 * provider of the SIM. 5 or 6 decimal digits. 638 * <p> 639 * Availability: SIM state must be {@link #SIM_STATE_READY} 640 * 641 * @see #getSimState 642 */ 643 public String getSimOperator() { 644 return SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC); 645 } 646 647 /** 648 * Returns the Service Provider Name (SPN). 649 * <p> 650 * Availability: SIM state must be {@link #SIM_STATE_READY} 651 * 652 * @see #getSimState 653 */ 654 public String getSimOperatorName() { 655 return SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA); 656 } 657 658 /** 659 * Returns the ISO country code equivalent for the SIM provider's country code. 660 */ 661 public String getSimCountryIso() { 662 return SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY); 663 } 664 665 /** 666 * Returns the serial number of the SIM, if applicable. Return null if it is 667 * unavailable. 668 * <p> 669 * Requires Permission: 670 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 671 */ 672 public String getSimSerialNumber() { 673 try { 674 return getSubscriberInfo().getIccSerialNumber(); 675 } catch (RemoteException ex) { 676 return null; 677 } catch (NullPointerException ex) { 678 // This could happen before phone restarts due to crashing 679 return null; 680 } 681 } 682 683 /** 684 * Return if the current radio is LTE on CDMA. This 685 * is a tri-state return value as for a period of time 686 * the mode may be unknown. 687 * 688 * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE} 689 * or {@link Phone#LTE_ON_CDMA_TRUE} 690 * 691 * @hide 692 */ 693 public int getLteOnCdmaMode() { 694 try { 695 return getITelephony().getLteOnCdmaMode(); 696 } catch (RemoteException ex) { 697 // Assume no ICC card if remote exception which shouldn't happen 698 return Phone.LTE_ON_CDMA_UNKNOWN; 699 } catch (NullPointerException ex) { 700 // This could happen before phone restarts due to crashing 701 return Phone.LTE_ON_CDMA_UNKNOWN; 702 } 703 } 704 705 // 706 // 707 // Subscriber Info 708 // 709 // 710 711 /** 712 * Returns the unique subscriber ID, for example, the IMSI for a GSM phone. 713 * Return null if it is unavailable. 714 * <p> 715 * Requires Permission: 716 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 717 */ 718 public String getSubscriberId() { 719 try { 720 return getSubscriberInfo().getSubscriberId(); 721 } catch (RemoteException ex) { 722 return null; 723 } catch (NullPointerException ex) { 724 // This could happen before phone restarts due to crashing 725 return null; 726 } 727 } 728 729 /** 730 * Returns the phone number string for line 1, for example, the MSISDN 731 * for a GSM phone. Return null if it is unavailable. 732 * <p> 733 * Requires Permission: 734 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 735 */ 736 public String getLine1Number() { 737 try { 738 return getSubscriberInfo().getLine1Number(); 739 } catch (RemoteException ex) { 740 return null; 741 } catch (NullPointerException ex) { 742 // This could happen before phone restarts due to crashing 743 return null; 744 } 745 } 746 747 /** 748 * Returns the alphabetic identifier associated with the line 1 number. 749 * Return null if it is unavailable. 750 * <p> 751 * Requires Permission: 752 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 753 * @hide 754 * nobody seems to call this. 755 */ 756 public String getLine1AlphaTag() { 757 try { 758 return getSubscriberInfo().getLine1AlphaTag(); 759 } catch (RemoteException ex) { 760 return null; 761 } catch (NullPointerException ex) { 762 // This could happen before phone restarts due to crashing 763 return null; 764 } 765 } 766 767 /** 768 * Returns the MSISDN string. 769 * for a GSM phone. Return null if it is unavailable. 770 * <p> 771 * Requires Permission: 772 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 773 * 774 * @hide 775 */ 776 public String getMsisdn() { 777 try { 778 return getSubscriberInfo().getMsisdn(); 779 } catch (RemoteException ex) { 780 return null; 781 } catch (NullPointerException ex) { 782 // This could happen before phone restarts due to crashing 783 return null; 784 } 785 } 786 787 /** 788 * Returns the voice mail number. Return null if it is unavailable. 789 * <p> 790 * Requires Permission: 791 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 792 */ 793 public String getVoiceMailNumber() { 794 try { 795 return getSubscriberInfo().getVoiceMailNumber(); 796 } catch (RemoteException ex) { 797 return null; 798 } catch (NullPointerException ex) { 799 // This could happen before phone restarts due to crashing 800 return null; 801 } 802 } 803 804 /** 805 * Returns the complete voice mail number. Return null if it is unavailable. 806 * <p> 807 * Requires Permission: 808 * {@link android.Manifest.permission#CALL_PRIVILEGED CALL_PRIVILEGED} 809 * 810 * @hide 811 */ 812 public String getCompleteVoiceMailNumber() { 813 try { 814 return getSubscriberInfo().getCompleteVoiceMailNumber(); 815 } catch (RemoteException ex) { 816 return null; 817 } catch (NullPointerException ex) { 818 // This could happen before phone restarts due to crashing 819 return null; 820 } 821 } 822 823 /** 824 * Returns the voice mail count. Return 0 if unavailable. 825 * <p> 826 * Requires Permission: 827 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 828 * @hide 829 */ 830 public int getVoiceMessageCount() { 831 try { 832 return getITelephony().getVoiceMessageCount(); 833 } catch (RemoteException ex) { 834 return 0; 835 } catch (NullPointerException ex) { 836 // This could happen before phone restarts due to crashing 837 return 0; 838 } 839 } 840 841 /** 842 * Retrieves the alphabetic identifier associated with the voice 843 * mail number. 844 * <p> 845 * Requires Permission: 846 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 847 */ 848 public String getVoiceMailAlphaTag() { 849 try { 850 return getSubscriberInfo().getVoiceMailAlphaTag(); 851 } catch (RemoteException ex) { 852 return null; 853 } catch (NullPointerException ex) { 854 // This could happen before phone restarts due to crashing 855 return null; 856 } 857 } 858 859 /** 860 * Returns the IMS private user identity (IMPI) that was loaded from the ISIM. 861 * @return the IMPI, or null if not present or not loaded 862 * @hide 863 */ 864 public String getIsimImpi() { 865 try { 866 return getSubscriberInfo().getIsimImpi(); 867 } catch (RemoteException ex) { 868 return null; 869 } catch (NullPointerException ex) { 870 // This could happen before phone restarts due to crashing 871 return null; 872 } 873 } 874 875 /** 876 * Returns the IMS home network domain name that was loaded from the ISIM. 877 * @return the IMS domain name, or null if not present or not loaded 878 * @hide 879 */ 880 public String getIsimDomain() { 881 try { 882 return getSubscriberInfo().getIsimDomain(); 883 } catch (RemoteException ex) { 884 return null; 885 } catch (NullPointerException ex) { 886 // This could happen before phone restarts due to crashing 887 return null; 888 } 889 } 890 891 /** 892 * Returns the IMS public user identities (IMPU) that were loaded from the ISIM. 893 * @return an array of IMPU strings, with one IMPU per string, or null if 894 * not present or not loaded 895 * @hide 896 */ 897 public String[] getIsimImpu() { 898 try { 899 return getSubscriberInfo().getIsimImpu(); 900 } catch (RemoteException ex) { 901 return null; 902 } catch (NullPointerException ex) { 903 // This could happen before phone restarts due to crashing 904 return null; 905 } 906 } 907 908 private IPhoneSubInfo getSubscriberInfo() { 909 // get it each time because that process crashes a lot 910 return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo")); 911 } 912 913 914 /** Device call state: No activity. */ 915 public static final int CALL_STATE_IDLE = 0; 916 /** Device call state: Ringing. A new call arrived and is 917 * ringing or waiting. In the latter case, another call is 918 * already active. */ 919 public static final int CALL_STATE_RINGING = 1; 920 /** Device call state: Off-hook. At least one call exists 921 * that is dialing, active, or on hold, and no calls are ringing 922 * or waiting. */ 923 public static final int CALL_STATE_OFFHOOK = 2; 924 925 /** 926 * Returns a constant indicating the call state (cellular) on the device. 927 */ 928 public int getCallState() { 929 try { 930 return getITelephony().getCallState(); 931 } catch (RemoteException ex) { 932 // the phone process is restarting. 933 return CALL_STATE_IDLE; 934 } catch (NullPointerException ex) { 935 // the phone process is restarting. 936 return CALL_STATE_IDLE; 937 } 938 } 939 940 /** Data connection activity: No traffic. */ 941 public static final int DATA_ACTIVITY_NONE = 0x00000000; 942 /** Data connection activity: Currently receiving IP PPP traffic. */ 943 public static final int DATA_ACTIVITY_IN = 0x00000001; 944 /** Data connection activity: Currently sending IP PPP traffic. */ 945 public static final int DATA_ACTIVITY_OUT = 0x00000002; 946 /** Data connection activity: Currently both sending and receiving 947 * IP PPP traffic. */ 948 public static final int DATA_ACTIVITY_INOUT = DATA_ACTIVITY_IN | DATA_ACTIVITY_OUT; 949 /** 950 * Data connection is active, but physical link is down 951 */ 952 public static final int DATA_ACTIVITY_DORMANT = 0x00000004; 953 954 /** 955 * Returns a constant indicating the type of activity on a data connection 956 * (cellular). 957 * 958 * @see #DATA_ACTIVITY_NONE 959 * @see #DATA_ACTIVITY_IN 960 * @see #DATA_ACTIVITY_OUT 961 * @see #DATA_ACTIVITY_INOUT 962 * @see #DATA_ACTIVITY_DORMANT 963 */ 964 public int getDataActivity() { 965 try { 966 return getITelephony().getDataActivity(); 967 } catch (RemoteException ex) { 968 // the phone process is restarting. 969 return DATA_ACTIVITY_NONE; 970 } catch (NullPointerException ex) { 971 // the phone process is restarting. 972 return DATA_ACTIVITY_NONE; 973 } 974 } 975 976 /** Data connection state: Unknown. Used before we know the state. 977 * @hide 978 */ 979 public static final int DATA_UNKNOWN = -1; 980 /** Data connection state: Disconnected. IP traffic not available. */ 981 public static final int DATA_DISCONNECTED = 0; 982 /** Data connection state: Currently setting up a data connection. */ 983 public static final int DATA_CONNECTING = 1; 984 /** Data connection state: Connected. IP traffic should be available. */ 985 public static final int DATA_CONNECTED = 2; 986 /** Data connection state: Suspended. The connection is up, but IP 987 * traffic is temporarily unavailable. For example, in a 2G network, 988 * data activity may be suspended when a voice call arrives. */ 989 public static final int DATA_SUSPENDED = 3; 990 991 /** 992 * Returns a constant indicating the current data connection state 993 * (cellular). 994 * 995 * @see #DATA_DISCONNECTED 996 * @see #DATA_CONNECTING 997 * @see #DATA_CONNECTED 998 * @see #DATA_SUSPENDED 999 */ 1000 public int getDataState() { 1001 try { 1002 return getITelephony().getDataState(); 1003 } catch (RemoteException ex) { 1004 // the phone process is restarting. 1005 return DATA_DISCONNECTED; 1006 } catch (NullPointerException ex) { 1007 return DATA_DISCONNECTED; 1008 } 1009 } 1010 1011 private ITelephony getITelephony() { 1012 return ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); 1013 } 1014 1015 // 1016 // 1017 // PhoneStateListener 1018 // 1019 // 1020 1021 /** 1022 * Registers a listener object to receive notification of changes 1023 * in specified telephony states. 1024 * <p> 1025 * To register a listener, pass a {@link PhoneStateListener} 1026 * and specify at least one telephony state of interest in 1027 * the events argument. 1028 * 1029 * At registration, and when a specified telephony state 1030 * changes, the telephony manager invokes the appropriate 1031 * callback method on the listener object and passes the 1032 * current (udpated) values. 1033 * <p> 1034 * To unregister a listener, pass the listener object and set the 1035 * events argument to 1036 * {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0). 1037 * 1038 * @param listener The {@link PhoneStateListener} object to register 1039 * (or unregister) 1040 * @param events The telephony state(s) of interest to the listener, 1041 * as a bitwise-OR combination of {@link PhoneStateListener} 1042 * LISTEN_ flags. 1043 */ 1044 public void listen(PhoneStateListener listener, int events) { 1045 String pkgForDebug = sContext != null ? sContext.getPackageName() : "<unknown>"; 1046 try { 1047 Boolean notifyNow = (getITelephony() != null); 1048 sRegistry.listen(pkgForDebug, listener.callback, events, notifyNow); 1049 } catch (RemoteException ex) { 1050 // system process dead 1051 } catch (NullPointerException ex) { 1052 // system process dead 1053 } 1054 } 1055 1056 /** 1057 * Returns the CDMA ERI icon index to display 1058 * 1059 * @hide 1060 */ 1061 public int getCdmaEriIconIndex() { 1062 try { 1063 return getITelephony().getCdmaEriIconIndex(); 1064 } catch (RemoteException ex) { 1065 // the phone process is restarting. 1066 return -1; 1067 } catch (NullPointerException ex) { 1068 return -1; 1069 } 1070 } 1071 1072 /** 1073 * Returns the CDMA ERI icon mode, 1074 * 0 - ON 1075 * 1 - FLASHING 1076 * 1077 * @hide 1078 */ 1079 public int getCdmaEriIconMode() { 1080 try { 1081 return getITelephony().getCdmaEriIconMode(); 1082 } catch (RemoteException ex) { 1083 // the phone process is restarting. 1084 return -1; 1085 } catch (NullPointerException ex) { 1086 return -1; 1087 } 1088 } 1089 1090 /** 1091 * Returns the CDMA ERI text, 1092 * 1093 * @hide 1094 */ 1095 public String getCdmaEriText() { 1096 try { 1097 return getITelephony().getCdmaEriText(); 1098 } catch (RemoteException ex) { 1099 // the phone process is restarting. 1100 return null; 1101 } catch (NullPointerException ex) { 1102 return null; 1103 } 1104 } 1105 1106 /** 1107 * @return true if the current device is "voice capable". 1108 * <p> 1109 * "Voice capable" means that this device supports circuit-switched 1110 * (i.e. voice) phone calls over the telephony network, and is allowed 1111 * to display the in-call UI while a cellular voice call is active. 1112 * This will be false on "data only" devices which can't make voice 1113 * calls and don't support any in-call UI. 1114 * <p> 1115 * Note: the meaning of this flag is subtly different from the 1116 * PackageManager.FEATURE_TELEPHONY system feature, which is available 1117 * on any device with a telephony radio, even if the device is 1118 * data-only. 1119 * 1120 * @hide pending API review 1121 */ 1122 public boolean isVoiceCapable() { 1123 if (sContext == null) return true; 1124 return sContext.getResources().getBoolean( 1125 com.android.internal.R.bool.config_voice_capable); 1126 } 1127 1128 /** 1129 * @return true if the current device supports sms service. 1130 * <p> 1131 * If true, this means that the device supports both sending and 1132 * receiving sms via the telephony network. 1133 * <p> 1134 * Note: Voicemail waiting sms, cell broadcasting sms, and MMS are 1135 * disabled when device doesn't support sms. 1136 * 1137 * @hide pending API review 1138 */ 1139 public boolean isSmsCapable() { 1140 if (sContext == null) return true; 1141 return sContext.getResources().getBoolean( 1142 com.android.internal.R.bool.config_sms_capable); 1143 } 1144 1145 /** 1146 * Returns all observed cell information of the device. 1147 * 1148 * @return List of CellInfo or null if info unavailable. 1149 * 1150 * <p>Requires Permission: 1151 * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES} 1152 * 1153 * @hide pending API review 1154 */ 1155 public List<CellInfo> getAllCellInfo() { 1156 try { 1157 return getITelephony().getAllCellInfo(); 1158 } catch (RemoteException ex) { 1159 return null; 1160 } catch (NullPointerException ex) { 1161 return null; 1162 } 1163 } 1164 } 1165