2 * Copyright (C) 2008 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 import static com.android.internal.util.Preconditions.checkNotNull;
21 import android.annotation.SdkConstant;
22 import android.annotation.SdkConstant.SdkConstantType;
23 import android.content.Context;
24 import android.os.Binder;
25 import android.os.Build.VERSION_CODES;
26 import android.os.Messenger;
27 import android.os.RemoteException;
28 import android.os.ResultReceiver;
29 import android.provider.Settings;
31 import java.net.InetAddress;
34 * Class that answers queries about the state of network connectivity. It also
35 * notifies applications when network connectivity changes. Get an instance
36 * of this class by calling
37 * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.CONNECTIVITY_SERVICE)}.
39 * The primary responsibilities of this class are to:
41 * <li>Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)</li>
42 * <li>Send broadcast intents when network connectivity changes</li>
43 * <li>Attempt to "fail over" to another network when connectivity to a network
45 * <li>Provide an API that allows applications to query the coarse-grained or fine-grained
46 * state of the available networks</li>
49 public class ConnectivityManager {
50 private static final String TAG = "ConnectivityManager";
53 * A change in network connectivity has occurred. A connection has either
54 * been established or lost. The NetworkInfo for the affected network is
55 * sent as an extra; it should be consulted to see what kind of
56 * connectivity event occurred.
58 * If this is a connection that was the result of failing over from a
59 * disconnected network, then the FAILOVER_CONNECTION boolean extra is
62 * For a loss of connectivity, if the connectivity manager is attempting
63 * to connect (or has already connected) to another network, the
64 * NetworkInfo for the new network is also passed as an extra. This lets
65 * any receivers of the broadcast know that they should not necessarily
66 * tell the user that no data traffic will be possible. Instead, the
67 * receiver should expect another broadcast soon, indicating either that
68 * the failover attempt succeeded (and so there is still overall data
69 * connectivity), or that the failover attempt failed, meaning that all
70 * connectivity has been lost.
72 * For a disconnect event, the boolean extra EXTRA_NO_CONNECTIVITY
73 * is set to {@code true} if there are no connected networks at all.
75 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
76 public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
79 * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any
80 * applicable {@link Settings.Secure#CONNECTIVITY_CHANGE_DELAY}.
84 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
85 public static final String CONNECTIVITY_ACTION_IMMEDIATE =
86 "android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE";
89 * The lookup key for a {@link NetworkInfo} object. Retrieve with
90 * {@link android.content.Intent#getParcelableExtra(String)}.
92 * @deprecated Since {@link NetworkInfo} can vary based on UID, applications
93 * should always obtain network information through
94 * {@link #getActiveNetworkInfo()} or
95 * {@link #getAllNetworkInfo()}.
96 * @see #EXTRA_NETWORK_TYPE
99 public static final String EXTRA_NETWORK_INFO = "networkInfo";
102 * Network type which triggered a {@link #CONNECTIVITY_ACTION} broadcast.
103 * Can be used with {@link #getNetworkInfo(int)} to get {@link NetworkInfo}
104 * state based on the calling application.
106 * @see android.content.Intent#getIntExtra(String, int)
108 public static final String EXTRA_NETWORK_TYPE = "networkType";
111 * The lookup key for a boolean that indicates whether a connect event
112 * is for a network to which the connectivity manager was failing over
113 * following a disconnect on another network.
114 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
116 public static final String EXTRA_IS_FAILOVER = "isFailover";
118 * The lookup key for a {@link NetworkInfo} object. This is supplied when
119 * there is another network that it may be possible to connect to. Retrieve with
120 * {@link android.content.Intent#getParcelableExtra(String)}.
122 public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
124 * The lookup key for a boolean that indicates whether there is a
125 * complete lack of connectivity, i.e., no network is available.
126 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
128 public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
130 * The lookup key for a string that indicates why an attempt to connect
131 * to a network failed. The string has no particular structure. It is
132 * intended to be used in notifications presented to users. Retrieve
133 * it with {@link android.content.Intent#getStringExtra(String)}.
135 public static final String EXTRA_REASON = "reason";
137 * The lookup key for a string that provides optionally supplied
138 * extra information about the network state. The information
139 * may be passed up from the lower networking layers, and its
140 * meaning may be specific to a particular network type. Retrieve
141 * it with {@link android.content.Intent#getStringExtra(String)}.
143 public static final String EXTRA_EXTRA_INFO = "extraInfo";
145 * The lookup key for an int that provides information about
146 * our connection to the internet at large. 0 indicates no connection,
147 * 100 indicates a great connection. Retrieve it with
148 * {@link android.content.Intent#getIntExtra(String, int)}.
151 public static final String EXTRA_INET_CONDITION = "inetCondition";
154 * Broadcast action to indicate the change of data activity status
155 * (idle or active) on a network in a recent period.
156 * The network becomes active when data transmission is started, or
157 * idle if there is no data transmission for a period of time.
160 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
161 public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE";
163 * The lookup key for an enum that indicates the network device type on which this data activity
167 public static final String EXTRA_DEVICE_TYPE = "deviceType";
169 * The lookup key for a boolean that indicates the device is active or not. {@code true} means
170 * it is actively sending or receiving data and {@code false} means it is idle.
173 public static final String EXTRA_IS_ACTIVE = "isActive";
176 * Broadcast Action: The setting for background data usage has changed
177 * values. Use {@link #getBackgroundDataSetting()} to get the current value.
179 * If an application uses the network in the background, it should listen
180 * for this broadcast and stop using the background data if the value is
184 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability
185 * of background data depends on several combined factors, and
186 * this broadcast is no longer sent. Instead, when background
187 * data is unavailable, {@link #getActiveNetworkInfo()} will now
188 * appear disconnected. During first boot after a platform
189 * upgrade, this broadcast will be sent once if
190 * {@link #getBackgroundDataSetting()} was {@code false} before
193 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
195 public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED =
196 "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
199 * Broadcast Action: The network connection may not be good
200 * uses {@code ConnectivityManager.EXTRA_INET_CONDITION} and
201 * {@code ConnectivityManager.EXTRA_NETWORK_INFO} to specify
202 * the network and it's condition.
205 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
206 public static final String INET_CONDITION_ACTION =
207 "android.net.conn.INET_CONDITION_ACTION";
210 * Broadcast Action: A tetherable connection has come or gone.
211 * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER},
212 * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER} and
213 * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate
214 * the current state of tethering. Each include a list of
215 * interface names in that state (may be empty).
218 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
219 public static final String ACTION_TETHER_STATE_CHANGED =
220 "android.net.conn.TETHER_STATE_CHANGED";
224 * gives a String[] listing all the interfaces configured for
225 * tethering and currently available for tethering.
227 public static final String EXTRA_AVAILABLE_TETHER = "availableArray";
231 * gives a String[] listing all the interfaces currently tethered
232 * (ie, has dhcp support and packets potentially forwarded/NATed)
234 public static final String EXTRA_ACTIVE_TETHER = "activeArray";
238 * gives a String[] listing all the interfaces we tried to tether and
239 * failed. Use {@link #getLastTetherError} to find the error code
240 * for any interfaces listed here.
242 public static final String EXTRA_ERRORED_TETHER = "erroredArray";
245 * Broadcast Action: The captive portal tracker has finished its test.
246 * Sent only while running Setup Wizard, in lieu of showing a user
250 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
251 public static final String ACTION_CAPTIVE_PORTAL_TEST_COMPLETED =
252 "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED";
254 * The lookup key for a boolean that indicates whether a captive portal was detected.
255 * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
258 public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal";
261 * The absence of a connection type.
264 public static final int TYPE_NONE = -1;
267 * The Mobile data connection. When active, all data traffic
268 * will use this network type's interface by default
269 * (it has a default route)
271 public static final int TYPE_MOBILE = 0;
273 * The WIFI data connection. When active, all data traffic
274 * will use this network type's interface by default
275 * (it has a default route).
277 public static final int TYPE_WIFI = 1;
279 * An MMS-specific Mobile data connection. This network type may use the
280 * same network interface as {@link #TYPE_MOBILE} or it may use a different
281 * one. This is used by applications needing to talk to the carrier's
282 * Multimedia Messaging Service servers.
284 public static final int TYPE_MOBILE_MMS = 2;
286 * A SUPL-specific Mobile data connection. This network type may use the
287 * same network interface as {@link #TYPE_MOBILE} or it may use a different
288 * one. This is used by applications needing to talk to the carrier's
289 * Secure User Plane Location servers for help locating the device.
291 public static final int TYPE_MOBILE_SUPL = 3;
293 * A DUN-specific Mobile data connection. This network type may use the
294 * same network interface as {@link #TYPE_MOBILE} or it may use a different
295 * one. This is sometimes by the system when setting up an upstream connection
296 * for tethering so that the carrier is aware of DUN traffic.
298 public static final int TYPE_MOBILE_DUN = 4;
300 * A High Priority Mobile data connection. This network type uses the
301 * same network interface as {@link #TYPE_MOBILE} but the routing setup
302 * is different. Only requesting processes will have access to the
303 * Mobile DNS servers and only IP's explicitly requested via {@link #requestRouteToHost}
304 * will route over this interface if no default route exists.
306 public static final int TYPE_MOBILE_HIPRI = 5;
308 * The WiMAX data connection. When active, all data traffic
309 * will use this network type's interface by default
310 * (it has a default route).
312 public static final int TYPE_WIMAX = 6;
315 * The Bluetooth data connection. When active, all data traffic
316 * will use this network type's interface by default
317 * (it has a default route).
319 public static final int TYPE_BLUETOOTH = 7;
322 * Dummy data connection. This should not be used on shipping devices.
324 public static final int TYPE_DUMMY = 8;
327 * The Ethernet data connection. When active, all data traffic
328 * will use this network type's interface by default
329 * (it has a default route).
331 public static final int TYPE_ETHERNET = 9;
334 * Over the air Administration.
337 public static final int TYPE_MOBILE_FOTA = 10;
340 * IP Multimedia Subsystem.
343 public static final int TYPE_MOBILE_IMS = 11;
346 * Carrier Branded Services.
349 public static final int TYPE_MOBILE_CBS = 12;
352 * A Wi-Fi p2p connection. Only requesting processes will have access to
353 * the peers connected.
356 public static final int TYPE_WIFI_P2P = 13;
359 public static final int MAX_RADIO_TYPE = TYPE_WIFI_P2P;
362 public static final int MAX_NETWORK_TYPE = TYPE_WIFI_P2P;
365 * If you want to set the default network preference,you can directly
366 * change the networkAttributes array in framework's config.xml.
368 * @deprecated Since we support so many more networks now, the single
369 * network default network preference can't really express
370 * the hierarchy. Instead, the default is defined by the
371 * networkAttributes in config.xml. You can determine
372 * the current value by calling {@link #getNetworkPreference()}
376 public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
379 * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in
380 * milliseconds. This was introduced because IPv6 routes seem to take a
381 * moment to settle - trying network activity before the routes are adjusted
382 * can lead to packets using the wrong interface or having the wrong IP address.
383 * This delay is a bit crude, but in the future hopefully we will have kernel
384 * notifications letting us know when it's safe to use the new network.
388 public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000;
390 private final IConnectivityManager mService;
393 * Tests if a given integer represents a valid network type.
394 * @param networkType the type to be tested
395 * @return a boolean. {@code true} if the type is valid, else {@code false}
397 public static boolean isNetworkTypeValid(int networkType) {
398 return networkType >= 0 && networkType <= MAX_NETWORK_TYPE;
402 * Returns a non-localized string representing a given network type.
403 * ONLY used for debugging output.
404 * @param type the type needing naming
405 * @return a String for the given type, or a string version of the type ("87")
406 * if no name is known.
409 public static String getNetworkTypeName(int type) {
415 case TYPE_MOBILE_MMS:
417 case TYPE_MOBILE_SUPL:
418 return "MOBILE_SUPL";
419 case TYPE_MOBILE_DUN:
421 case TYPE_MOBILE_HIPRI:
422 return "MOBILE_HIPRI";
431 case TYPE_MOBILE_FOTA:
432 return "MOBILE_FOTA";
433 case TYPE_MOBILE_IMS:
435 case TYPE_MOBILE_CBS:
440 return Integer.toString(type);
445 * Checks if a given type uses the cellular data connection.
446 * This should be replaced in the future by a network property.
447 * @param networkType the type to check
448 * @return a boolean - {@code true} if uses cellular network, else {@code false}
451 public static boolean isNetworkTypeMobile(int networkType) {
452 switch (networkType) {
454 case TYPE_MOBILE_MMS:
455 case TYPE_MOBILE_SUPL:
456 case TYPE_MOBILE_DUN:
457 case TYPE_MOBILE_HIPRI:
458 case TYPE_MOBILE_FOTA:
459 case TYPE_MOBILE_IMS:
460 case TYPE_MOBILE_CBS:
468 * Specifies the preferred network type. When the device has more
469 * than one type available the preferred network type will be used.
470 * Note that this made sense when we only had 2 network types,
471 * but with more and more default networks we need an array to list
472 * their ordering. This will be deprecated soon.
474 * @param preference the network type to prefer over all others. It is
475 * unspecified what happens to the old preferred network in the
478 public void setNetworkPreference(int preference) {
480 mService.setNetworkPreference(preference);
481 } catch (RemoteException e) {
486 * Retrieves the current preferred network type.
487 * Note that this made sense when we only had 2 network types,
488 * but with more and more default networks we need an array to list
489 * their ordering. This will be deprecated soon.
491 * @return an integer representing the preferred network type
493 * <p>This method requires the caller to hold the permission
494 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
496 public int getNetworkPreference() {
498 return mService.getNetworkPreference();
499 } catch (RemoteException e) {
505 * Returns details about the currently active default data network. When
506 * connected, this network is the default route for outgoing connections.
507 * You should always check {@link NetworkInfo#isConnected()} before initiating
508 * network traffic. This may return {@code null} when there is no default
511 * @return a {@link NetworkInfo} object for the current default network
512 * or {@code null} if no network default network is currently active
514 * <p>This method requires the call to hold the permission
515 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
517 public NetworkInfo getActiveNetworkInfo() {
519 return mService.getActiveNetworkInfo();
520 } catch (RemoteException e) {
526 * Returns details about the currently active default data network
527 * for a given uid. This is for internal use only to avoid spying
530 * @return a {@link NetworkInfo} object for the current default network
531 * for the given uid or {@code null} if no default network is
532 * available for the specified uid.
534 * <p>This method requires the caller to hold the permission
535 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}
538 public NetworkInfo getActiveNetworkInfoForUid(int uid) {
540 return mService.getActiveNetworkInfoForUid(uid);
541 } catch (RemoteException e) {
547 * Returns connection status information about a particular
550 * @param networkType integer specifying which networkType in
551 * which you're interested.
552 * @return a {@link NetworkInfo} object for the requested
553 * network type or {@code null} if the type is not
554 * supported by the device.
556 * <p>This method requires the call to hold the permission
557 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
559 public NetworkInfo getNetworkInfo(int networkType) {
561 return mService.getNetworkInfo(networkType);
562 } catch (RemoteException e) {
568 * Returns connection status information about all network
569 * types supported by the device.
571 * @return an array of {@link NetworkInfo} objects. Check each
572 * {@link NetworkInfo#getType} for which type each applies.
574 * <p>This method requires the call to hold the permission
575 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
577 public NetworkInfo[] getAllNetworkInfo() {
579 return mService.getAllNetworkInfo();
580 } catch (RemoteException e) {
586 * Returns the IP information for the current default network.
588 * @return a {@link LinkProperties} object describing the IP info
589 * for the current default network, or {@code null} if there
590 * is no current default network.
592 * <p>This method requires the call to hold the permission
593 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
596 public LinkProperties getActiveLinkProperties() {
598 return mService.getActiveLinkProperties();
599 } catch (RemoteException e) {
605 * Returns the IP information for a given network type.
607 * @param networkType the network type of interest.
608 * @return a {@link LinkProperties} object describing the IP info
609 * for the given networkType, or {@code null} if there is
610 * no current default network.
612 * <p>This method requires the call to hold the permission
613 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
616 public LinkProperties getLinkProperties(int networkType) {
618 return mService.getLinkProperties(networkType);
619 } catch (RemoteException e) {
625 * Tells each network type to set its radio power state as directed.
627 * @param turnOn a boolean, {@code true} to turn the radios on,
628 * {@code false} to turn them off.
629 * @return a boolean, {@code true} indicating success. All network types
630 * will be tried, even if some fail.
632 * <p>This method requires the call to hold the permission
633 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
636 public boolean setRadios(boolean turnOn) {
638 return mService.setRadios(turnOn);
639 } catch (RemoteException e) {
645 * Tells a given networkType to set its radio power state as directed.
647 * @param networkType the int networkType of interest.
648 * @param turnOn a boolean, {@code true} to turn the radio on,
649 * {@code} false to turn it off.
650 * @return a boolean, {@code true} indicating success.
652 * <p>This method requires the call to hold the permission
653 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
656 public boolean setRadio(int networkType, boolean turnOn) {
658 return mService.setRadio(networkType, turnOn);
659 } catch (RemoteException e) {
665 * Tells the underlying networking system that the caller wants to
666 * begin using the named feature. The interpretation of {@code feature}
667 * is completely up to each networking implementation.
668 * <p>This method requires the caller to hold the permission
669 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
670 * @param networkType specifies which network the request pertains to
671 * @param feature the name of the feature to be used
672 * @return an integer value representing the outcome of the request.
673 * The interpretation of this value is specific to each networking
674 * implementation+feature combination, except that the value {@code -1}
675 * always indicates failure.
677 public int startUsingNetworkFeature(int networkType, String feature) {
679 return mService.startUsingNetworkFeature(networkType, feature,
681 } catch (RemoteException e) {
687 * Tells the underlying networking system that the caller is finished
688 * using the named feature. The interpretation of {@code feature}
689 * is completely up to each networking implementation.
690 * <p>This method requires the caller to hold the permission
691 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
692 * @param networkType specifies which network the request pertains to
693 * @param feature the name of the feature that is no longer needed
694 * @return an integer value representing the outcome of the request.
695 * The interpretation of this value is specific to each networking
696 * implementation+feature combination, except that the value {@code -1}
697 * always indicates failure.
699 public int stopUsingNetworkFeature(int networkType, String feature) {
701 return mService.stopUsingNetworkFeature(networkType, feature);
702 } catch (RemoteException e) {
708 * Ensure that a network route exists to deliver traffic to the specified
709 * host via the specified network interface. An attempt to add a route that
710 * already exists is ignored, but treated as successful.
711 * <p>This method requires the caller to hold the permission
712 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
713 * @param networkType the type of the network over which traffic to the specified
714 * host is to be routed
715 * @param hostAddress the IP address of the host to which the route is desired
716 * @return {@code true} on success, {@code false} on failure
718 public boolean requestRouteToHost(int networkType, int hostAddress) {
719 InetAddress inetAddress = NetworkUtils.intToInetAddress(hostAddress);
721 if (inetAddress == null) {
725 return requestRouteToHostAddress(networkType, inetAddress);
729 * Ensure that a network route exists to deliver traffic to the specified
730 * host via the specified network interface. An attempt to add a route that
731 * already exists is ignored, but treated as successful.
732 * @param networkType the type of the network over which traffic to the specified
733 * host is to be routed
734 * @param hostAddress the IP address of the host to which the route is desired
735 * @return {@code true} on success, {@code false} on failure
738 public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
739 byte[] address = hostAddress.getAddress();
741 return mService.requestRouteToHostAddress(networkType, address);
742 } catch (RemoteException e) {
748 * Returns the value of the setting for background data usage. If false,
749 * applications should not use the network if the application is not in the
750 * foreground. Developers should respect this setting, and check the value
751 * of this before performing any background data operations.
753 * All applications that have background services that use the network
754 * should listen to {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}.
756 * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, availability of
757 * background data depends on several combined factors, and this method will
758 * always return {@code true}. Instead, when background data is unavailable,
759 * {@link #getActiveNetworkInfo()} will now appear disconnected.
761 * @return Whether background data usage is allowed.
764 public boolean getBackgroundDataSetting() {
765 // assume that background data is allowed; final authority is
766 // NetworkInfo which may be blocked.
771 * Sets the value of the setting for background data usage.
773 * @param allowBackgroundData Whether an application should use data while
774 * it is in the background.
776 * @attr ref android.Manifest.permission#CHANGE_BACKGROUND_DATA_SETTING
777 * @see #getBackgroundDataSetting()
781 public void setBackgroundDataSetting(boolean allowBackgroundData) {
786 * Return quota status for the current active network, or {@code null} if no
787 * network is active. Quota status can change rapidly, so these values
788 * shouldn't be cached.
790 * <p>This method requires the call to hold the permission
791 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
795 public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
797 return mService.getActiveNetworkQuotaInfo();
798 } catch (RemoteException e) {
804 * Gets the value of the setting for enabling Mobile data.
806 * @return Whether mobile data is enabled.
808 * <p>This method requires the call to hold the permission
809 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
812 public boolean getMobileDataEnabled() {
814 return mService.getMobileDataEnabled();
815 } catch (RemoteException e) {
821 * Sets the persisted value for enabling/disabling Mobile data.
823 * @param enabled Whether the user wants the mobile data connection used
827 public void setMobileDataEnabled(boolean enabled) {
829 mService.setMobileDataEnabled(enabled);
830 } catch (RemoteException e) {
837 public ConnectivityManager(IConnectivityManager service) {
838 mService = checkNotNull(service, "missing IConnectivityManager");
842 public static ConnectivityManager from(Context context) {
843 return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
847 * Get the set of tetherable, available interfaces. This list is limited by
848 * device configuration and current interface existence.
850 * @return an array of 0 or more Strings of tetherable interface names.
852 * <p>This method requires the call to hold the permission
853 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
856 public String[] getTetherableIfaces() {
858 return mService.getTetherableIfaces();
859 } catch (RemoteException e) {
860 return new String[0];
865 * Get the set of tethered interfaces.
867 * @return an array of 0 or more String of currently tethered interface names.
869 * <p>This method requires the call to hold the permission
870 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
873 public String[] getTetheredIfaces() {
875 return mService.getTetheredIfaces();
876 } catch (RemoteException e) {
877 return new String[0];
882 * Get the set of interface names which attempted to tether but
883 * failed. Re-attempting to tether may cause them to reset to the Tethered
884 * state. Alternatively, causing the interface to be destroyed and recreated
885 * may cause them to reset to the available state.
886 * {@link ConnectivityManager#getLastTetherError} can be used to get more
887 * information on the cause of the errors.
889 * @return an array of 0 or more String indicating the interface names
890 * which failed to tether.
892 * <p>This method requires the call to hold the permission
893 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
896 public String[] getTetheringErroredIfaces() {
898 return mService.getTetheringErroredIfaces();
899 } catch (RemoteException e) {
900 return new String[0];
905 * Attempt to tether the named interface. This will setup a dhcp server
906 * on the interface, forward and NAT IP packets and forward DNS requests
907 * to the best active upstream network interface. Note that if no upstream
908 * IP network interface is available, dhcp will still run and traffic will be
909 * allowed between the tethered devices and this device, though upstream net
910 * access will of course fail until an upstream network interface becomes
913 * @param iface the interface name to tether.
914 * @return error a {@code TETHER_ERROR} value indicating success or failure type
916 * <p>This method requires the call to hold the permission
917 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
920 public int tether(String iface) {
922 return mService.tether(iface);
923 } catch (RemoteException e) {
924 return TETHER_ERROR_SERVICE_UNAVAIL;
929 * Stop tethering the named interface.
931 * @param iface the interface name to untether.
932 * @return error a {@code TETHER_ERROR} value indicating success or failure type
934 * <p>This method requires the call to hold the permission
935 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
938 public int untether(String iface) {
940 return mService.untether(iface);
941 } catch (RemoteException e) {
942 return TETHER_ERROR_SERVICE_UNAVAIL;
947 * Check if the device allows for tethering. It may be disabled via
948 * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or
949 * due to device configuration.
951 * @return a boolean - {@code true} indicating Tethering is supported.
953 * <p>This method requires the call to hold the permission
954 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
957 public boolean isTetheringSupported() {
959 return mService.isTetheringSupported();
960 } catch (RemoteException e) {
966 * Get the list of regular expressions that define any tetherable
967 * USB network interfaces. If USB tethering is not supported by the
968 * device, this list should be empty.
970 * @return an array of 0 or more regular expression Strings defining
971 * what interfaces are considered tetherable usb interfaces.
973 * <p>This method requires the call to hold the permission
974 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
977 public String[] getTetherableUsbRegexs() {
979 return mService.getTetherableUsbRegexs();
980 } catch (RemoteException e) {
981 return new String[0];
986 * Get the list of regular expressions that define any tetherable
987 * Wifi network interfaces. If Wifi tethering is not supported by the
988 * device, this list should be empty.
990 * @return an array of 0 or more regular expression Strings defining
991 * what interfaces are considered tetherable wifi interfaces.
993 * <p>This method requires the call to hold the permission
994 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
997 public String[] getTetherableWifiRegexs() {
999 return mService.getTetherableWifiRegexs();
1000 } catch (RemoteException e) {
1001 return new String[0];
1006 * Get the list of regular expressions that define any tetherable
1007 * Bluetooth network interfaces. If Bluetooth tethering is not supported by the
1008 * device, this list should be empty.
1010 * @return an array of 0 or more regular expression Strings defining
1011 * what interfaces are considered tetherable bluetooth interfaces.
1013 * <p>This method requires the call to hold the permission
1014 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1017 public String[] getTetherableBluetoothRegexs() {
1019 return mService.getTetherableBluetoothRegexs();
1020 } catch (RemoteException e) {
1021 return new String[0];
1026 * Attempt to both alter the mode of USB and Tethering of USB. A
1027 * utility method to deal with some of the complexity of USB - will
1028 * attempt to switch to Rndis and subsequently tether the resulting
1029 * interface on {@code true} or turn off tethering and switch off
1030 * Rndis on {@code false}.
1032 * @param enable a boolean - {@code true} to enable tethering
1033 * @return error a {@code TETHER_ERROR} value indicating success or failure type
1035 * <p>This method requires the call to hold the permission
1036 * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}.
1039 public int setUsbTethering(boolean enable) {
1041 return mService.setUsbTethering(enable);
1042 } catch (RemoteException e) {
1043 return TETHER_ERROR_SERVICE_UNAVAIL;
1048 public static final int TETHER_ERROR_NO_ERROR = 0;
1050 public static final int TETHER_ERROR_UNKNOWN_IFACE = 1;
1052 public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2;
1054 public static final int TETHER_ERROR_UNSUPPORTED = 3;
1056 public static final int TETHER_ERROR_UNAVAIL_IFACE = 4;
1058 public static final int TETHER_ERROR_MASTER_ERROR = 5;
1060 public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6;
1062 public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7;
1064 public static final int TETHER_ERROR_ENABLE_NAT_ERROR = 8;
1066 public static final int TETHER_ERROR_DISABLE_NAT_ERROR = 9;
1068 public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10;
1071 * Get a more detailed error code after a Tethering or Untethering
1072 * request asynchronously failed.
1074 * @param iface The name of the interface of interest
1075 * @return error The error code of the last error tethering or untethering the named
1078 * <p>This method requires the call to hold the permission
1079 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1082 public int getLastTetherError(String iface) {
1084 return mService.getLastTetherError(iface);
1085 } catch (RemoteException e) {
1086 return TETHER_ERROR_SERVICE_UNAVAIL;
1091 * Try to ensure the device stays awake until we connect with the next network.
1092 * Actually just holds a wakelock for a number of seconds while we try to connect
1093 * to any default networks. This will expire if the timeout passes or if we connect
1094 * to a default after this is called. For internal use only.
1096 * @param forWhom the name of the network going down for logging purposes
1097 * @return {@code true} on success, {@code false} on failure
1099 * <p>This method requires the call to hold the permission
1100 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1103 public boolean requestNetworkTransitionWakelock(String forWhom) {
1105 mService.requestNetworkTransitionWakelock(forWhom);
1107 } catch (RemoteException e) {
1113 * Report network connectivity status. This is currently used only
1114 * to alter status bar UI.
1116 * @param networkType The type of network you want to report on
1117 * @param percentage The quality of the connection 0 is bad, 100 is good
1119 * <p>This method requires the call to hold the permission
1120 * {@link android.Manifest.permission#STATUS_BAR}.
1123 public void reportInetCondition(int networkType, int percentage) {
1125 mService.reportInetCondition(networkType, percentage);
1126 } catch (RemoteException e) {
1131 * Set a network-independent global http proxy. This is not normally what you want
1132 * for typical HTTP proxies - they are general network dependent. However if you're
1133 * doing something unusual like general internal filtering this may be useful. On
1134 * a private network where the proxy is not accessible, you may break HTTP using this.
1136 * @param proxyProperties The a {@link ProxyProperites} object defining the new global
1137 * HTTP proxy. A {@code null} value will clear the global HTTP proxy.
1139 * <p>This method requires the call to hold the permission
1140 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1143 public void setGlobalProxy(ProxyProperties p) {
1145 mService.setGlobalProxy(p);
1146 } catch (RemoteException e) {
1151 * Retrieve any network-independent global HTTP proxy.
1153 * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null}
1154 * if no global HTTP proxy is set.
1156 * <p>This method requires the call to hold the permission
1157 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1160 public ProxyProperties getGlobalProxy() {
1162 return mService.getGlobalProxy();
1163 } catch (RemoteException e) {
1169 * Get the HTTP proxy settings for the current default network. Note that
1170 * if a global proxy is set, it will override any per-network setting.
1172 * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no
1173 * HTTP proxy is active.
1175 * <p>This method requires the call to hold the permission
1176 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1179 public ProxyProperties getProxy() {
1181 return mService.getProxy();
1182 } catch (RemoteException e) {
1188 * Sets a secondary requirement bit for the given networkType.
1189 * This requirement bit is generally under the control of the carrier
1190 * or its agents and is not directly controlled by the user.
1192 * @param networkType The network who's dependence has changed
1193 * @param met Boolean - true if network use is OK, false if not
1195 * <p>This method requires the call to hold the permission
1196 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1199 public void setDataDependency(int networkType, boolean met) {
1201 mService.setDataDependency(networkType, met);
1202 } catch (RemoteException e) {
1207 * Returns true if the hardware supports the given network type
1208 * else it returns false. This doesn't indicate we have coverage
1209 * or are authorized onto a network, just whether or not the
1210 * hardware supports it. For example a GSM phone without a SIM
1211 * should still return {@code true} for mobile data, but a wifi only
1212 * tablet would return {@code false}.
1214 * @param networkType The network type we'd like to check
1215 * @return {@code true} if supported, else {@code false}
1217 * <p>This method requires the call to hold the permission
1218 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1221 public boolean isNetworkSupported(int networkType) {
1223 return mService.isNetworkSupported(networkType);
1224 } catch (RemoteException e) {}
1229 * Returns if the currently active data network is metered. A network is
1230 * classified as metered when the user is sensitive to heavy data usage on
1231 * that connection due to monetary costs, data limitations or
1232 * battery/performance issues. You should check this before doing large
1233 * data transfers, and warn the user or delay the operation until another
1234 * network is available.
1236 * @return {@code true} if large transfers should be avoided, otherwise
1239 * <p>This method requires the call to hold the permission
1240 * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
1242 public boolean isActiveNetworkMetered() {
1244 return mService.isActiveNetworkMetered();
1245 } catch (RemoteException e) {
1251 * If the LockdownVpn mechanism is enabled, updates the vpn
1252 * with a reload of its profile.
1254 * @return a boolean with {@code} indicating success
1256 * <p>This method can only be called by the system UID
1259 public boolean updateLockdownVpn() {
1261 return mService.updateLockdownVpn();
1262 } catch (RemoteException e) {
1268 * Signal that the captive portal check on the indicated network
1269 * is complete and we can turn the network on for general use.
1271 * @param info the {@link NetworkInfo} object for the networkType
1274 * <p>This method requires the call to hold the permission
1275 * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}.
1278 public void captivePortalCheckComplete(NetworkInfo info) {
1280 mService.captivePortalCheckComplete(info);
1281 } catch (RemoteException e) {
1286 * Supply the backend messenger for a network tracker
1288 * @param type NetworkType to set
1289 * @param messenger {@link Messenger}
1292 public void supplyMessenger(int networkType, Messenger messenger) {
1294 mService.supplyMessenger(networkType, messenger);
1295 } catch (RemoteException e) {
1300 * The ResultReceiver resultCode for checkMobileProvisioning (CMP_RESULT_CODE)
1304 * No connection was possible to the network.
1307 public static final int CMP_RESULT_CODE_NO_CONNECTION = 0;
1310 * A connection was made to the internet, all is well.
1313 public static final int CMP_RESULT_CODE_CONNECTABLE = 1;
1316 * A connection was made but there was a redirection, we appear to be in walled garden.
1317 * This is an indication of a warm sim on a mobile network.
1320 public static final int CMP_RESULT_CODE_REDIRECTED = 2;
1323 * A connection was made but no dns server was available to resolve a name to address.
1324 * This is an indication of a warm sim on a mobile network.
1328 public static final int CMP_RESULT_CODE_NO_DNS = 3;
1331 * A connection was made but could not open a TCP connection.
1332 * This is an indication of a warm sim on a mobile network.
1335 public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4;
1338 * Check mobile provisioning. The resultCode passed to
1339 * onReceiveResult will be one of the CMP_RESULT_CODE_xxxx values above.
1340 * This may take a minute or more to complete.
1342 * @param sendNotificaiton, when true a notification will be sent to user.
1343 * @param suggestedTimeOutMs, timeout in milliseconds
1344 * @param resultReceiver needs to be supplied to receive the result
1346 * @return time out that will be used, maybe less that suggestedTimeOutMs
1351 public int checkMobileProvisioning(boolean sendNotification, int suggestedTimeOutMs,
1352 ResultReceiver resultReceiver) {
1355 timeOutMs = mService.checkMobileProvisioning(sendNotification, suggestedTimeOutMs,
1357 } catch (RemoteException e) {
1363 * Get the carrier provisioning url.
1366 public String getMobileProvisioningUrl() {
1368 return mService.getMobileProvisioningUrl();
1369 } catch (RemoteException e) {