diff options
| -rw-r--r-- | core/api/current.txt | 15 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 8 | ||||
| -rw-r--r-- | core/res/res/values/strings.xml | 6 | ||||
| -rw-r--r-- | telephony/common/com/android/internal/telephony/TelephonyPermissions.java | 20 | ||||
| -rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 46 |
5 files changed, 72 insertions, 23 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 4ba6bf4043c3..f9ac373423a6 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -120,6 +120,7 @@ package android { field @Deprecated public static final String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY"; field @Deprecated public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS"; field public static final String QUERY_ALL_PACKAGES = "android.permission.QUERY_ALL_PACKAGES"; + field public static final String READ_BASIC_PHONE_STATE = "android.permission.READ_BASIC_PHONE_STATE"; field public static final String READ_CALENDAR = "android.permission.READ_CALENDAR"; field public static final String READ_CALL_LOG = "android.permission.READ_CALL_LOG"; field public static final String READ_CONTACTS = "android.permission.READ_CONTACTS"; @@ -42722,11 +42723,11 @@ package android.telephony { method public int getCarrierIdFromSimMccMnc(); method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public android.telephony.CellLocation getCellLocation(); method public int getDataActivity(); - method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getDataNetworkType(); + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public int getDataNetworkType(); method public int getDataState(); method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId(); method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDeviceId(int); - method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getDeviceSoftwareVersion(); + method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public String getDeviceSoftwareVersion(); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList(); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.Map<java.lang.Integer,java.util.List<android.telephony.emergency.EmergencyNumber>> getEmergencyNumberList(int); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public java.util.List<java.lang.String> getEquivalentHomePlmns(); @@ -42779,7 +42780,7 @@ package android.telephony { method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVisualVoicemailPackageName(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailAlphaTag(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getVoiceMailNumber(); - method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getVoiceNetworkType(); + method @RequiresPermission(anyOf={android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public int getVoiceNetworkType(); method @Nullable public android.net.Uri getVoicemailRingtoneUri(android.telecom.PhoneAccountHandle); method public boolean hasCarrierPrivileges(); method public boolean hasIccCard(); @@ -42791,10 +42792,10 @@ package android.telephony { method @Deprecated public String iccTransmitApduLogicalChannel(int, int, int, int, int, int, String); method public boolean isConcurrentVoiceAndDataSupported(); method public boolean isDataCapable(); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public boolean isDataConnectionAllowed(); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataEnabled(); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean isDataEnabledForReason(int); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataRoamingEnabled(); + method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataConnectionAllowed(); + method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataEnabled(); + method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataEnabledForReason(int); + method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataRoamingEnabled(); method public boolean isEmergencyNumber(@NonNull String); method public boolean isHearingAidCompatibilitySupported(); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRECISE_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public boolean isManualNetworkSelectionAllowed(); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 4c5877b06b93..39403d7fb58c 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1200,6 +1200,14 @@ android:description="@string/permdesc_readPhoneState" android:protectionLevel="dangerous" /> + <!-- Allows read only access to phone state with a non dangerous permission, + including the information like cellular network type, software version. --> + <permission android:name="android.permission.READ_BASIC_PHONE_STATE" + android:permissionGroup="android.permission-group.UNDEFINED" + android:label="@string/permlab_readBasicPhoneState" + android:description="@string/permdesc_readBasicPhoneState" + android:protectionLevel="normal" /> + <!-- Allows read access to the device's phone number(s). This is a subset of the capabilities granted by {@link #READ_PHONE_STATE} but is exposed to instant applications. <p>Protection level: dangerous--> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 0e09936bc251..96cd839540da 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1350,6 +1350,12 @@ phone number and device IDs, whether a call is active, and the remote number connected by a call.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=80]--> + <string name="permlab_readBasicPhoneState">read basic telephony status and identity </string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] --> + <string name="permdesc_readBasicPhoneState">Allows the app to access the basic telephony + features of the device.</string> + <!-- Title of an application permission. When granted the user is giving access to a third party app to route its calls through the system. --> <string name="permlab_manageOwnCalls">route calls through the system</string> diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java index 4d81b5e54470..ce4363f66d1c 100644 --- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java @@ -107,6 +107,26 @@ public final class TelephonyPermissions { } } + + /** + * Check whether the caller (or self, if not processing an IPC) has non dangerous + * read phone state permission. + * @param context app context + * @param message detail message + * @return true if permission is granted, else false + */ + public static boolean checkCallingOrSelfReadNonDangerousPhoneStateNoThrow( + Context context, String message) { + try { + context.enforcePermission( + Manifest.permission.READ_BASIC_PHONE_STATE, + Binder.getCallingPid(), Binder.getCallingUid(), message); + return true; + } catch (SecurityException se) { + return false; + } + } + /** * Check whether the app with the given pid/uid can read phone state. * diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 493fa4ee1616..e4f8e90aecca 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1895,9 +1895,10 @@ public class TelephonyManager { * the IMEI/SV for GSM phones. Return null if the software version is * not available. * <p> - * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}. */ - @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + @RequiresPermission(anyOf = { + android.Manifest.permission.READ_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) @Nullable public String getDeviceSoftwareVersion() { return getDeviceSoftwareVersion(getSlotIndex()); @@ -2959,7 +2960,9 @@ public class TelephonyManager { * when opportunistic network is providing cellular internet connection to the user. * * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} - * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * or {@link android.Manifest.permission#READ_BASIC_PHONE_STATE + * READ_BASIC_PHONE_STATE} or that the calling app has carrier privileges + * (see {@link #hasCarrierPrivileges}). * * @return the network type * @@ -2982,7 +2985,9 @@ public class TelephonyManager { * @see #NETWORK_TYPE_NR */ @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges - @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + @RequiresPermission(anyOf = { + android.Manifest.permission.READ_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) public @NetworkType int getDataNetworkType() { return getDataNetworkType(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } @@ -3020,10 +3025,14 @@ public class TelephonyManager { * Returns the NETWORK_TYPE_xxxx for voice * * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} - * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * or {@link android.Manifest.permission#READ_BASIC_PHONE_STATE + * READ_BASIC_PHONE_STATE} or that the calling app has carrier privileges + * (see {@link #hasCarrierPrivileges}). */ @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges - @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + @RequiresPermission(anyOf = { + android.Manifest.permission.READ_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) public @NetworkType int getVoiceNetworkType() { return getVoiceNetworkType(getSubId()); } @@ -9978,7 +9987,9 @@ public class TelephonyManager { * * <p>Requires one of the following permissions: * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}, - * {@link android.Manifest.permission#MODIFY_PHONE_STATE}, or that the calling app has carrier + * {@link android.Manifest.permission#MODIFY_PHONE_STATE}, or + * {@link android.Manifest.permission#READ_BASIC_PHONE_STATE + * READ_BASIC_PHONE_STATE} or that the calling app has carrier * privileges (see {@link #hasCarrierPrivileges}). * * <p>Note that this does not take into account any data restrictions that may be present on the @@ -9989,7 +10000,8 @@ public class TelephonyManager { */ @RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE, - android.Manifest.permission.READ_PHONE_STATE}) + android.Manifest.permission.READ_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataEnabled() { try { return isDataEnabledForReason(DATA_ENABLED_REASON_USER); @@ -10008,14 +10020,17 @@ public class TelephonyManager { * * <p>Requires one of the following permissions: * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}, - * {@link android.Manifest.permission#READ_PHONE_STATE} or that the calling app + * {@link android.Manifest.permission#READ_PHONE_STATE} or + * {@link android.Manifest.permission#READ_BASIC_PHONE_STATE + * READ_BASIC_PHONE_STATE} or that the calling app * has carrier privileges (see {@link #hasCarrierPrivileges}). * * @return {@code true} if the data roaming is enabled on the subscription, otherwise return * {@code false}. */ @RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE, - android.Manifest.permission.READ_PHONE_STATE}) + android.Manifest.permission.READ_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataRoamingEnabled() { boolean isDataRoamingEnabled = false; try { @@ -12421,11 +12436,13 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} or * {@link android.Manifest.permission#ACCESS_NETWORK_STATE} or * {@link android.Manifest.permission#MODIFY_PHONE_STATE} + * {@link android.Manifest.permission#READ_BASIC_PHONE_STATE} * @throws IllegalStateException if the Telephony process is not currently available. */ @RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, - android.Manifest.permission.MODIFY_PHONE_STATE + android.Manifest.permission.MODIFY_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE }) public boolean isDataEnabledForReason(@DataEnabledReason int reason) { return isDataEnabledForReason(getSubId(), reason); @@ -12561,14 +12578,11 @@ public class TelephonyManager { * <LI>And possibly others.</LI> * </UL> * @return {@code true} if the overall data connection is allowed; {@code false} if not. - * <p>Requires Permission: - * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} or - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE} or - * android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE */ @RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, - android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE}) + android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + android.Manifest.permission.READ_BASIC_PHONE_STATE}) public boolean isDataConnectionAllowed() { boolean retVal = false; try { |