1. SystemUI
android SystemUI包括StatusBar(状态栏)、NavigationBar(导航栏)、Quicksettings以及settings等。
StatusBar为桌面最上面的状态栏,显示时间,信号强度,是否静音,是否连接wifi等。
NavigationBar为手机最底端的返回键,home键等。
Quicksettings为手机顶端下拉菜单显示的WLAN,声音,信号等操作图标。
settings为手机的设定。
2. SystemFeature
systemFeature是系统特征,保存在手机system/etc/permissons/platfom.xml以及对应的...xml文件,指定系统是否具备某些特性。
/**
* Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device's
* audio pipeline is low-latency, more suitable for audio applications sensitive to delays or
* lag in sound input or output.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device is capable of communicating with
* other devices via Bluetooth.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device is capable of communicating with
* other devices via Bluetooth Low Energy radio.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_BLUETOOTH_LE = "android.hardware.bluetooth_le";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a camera facing away
* from the screen.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA = "android.hardware.camera";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's camera supports auto-focus.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has at least one camera pointing in
* some direction.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_ANY = "android.hardware.camera.any";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's camera supports flash.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a front facing camera.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CAMERA_FRONT = "android.hardware.camera.front";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device is capable of communicating with
* consumer IR devices.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_CONSUMER_IR = "android.hardware.consumerir";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports one or more methods of
* reporting current location.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_LOCATION = "android.hardware.location";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a Global Positioning System
* receiver and can report precise location.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device can report location with coarse
* accuracy using a network-based geolocation system.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device can record audio via a
* microphone.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_MICROPHONE = "android.hardware.microphone";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device can communicate using Near-Field
* Communications (NFC).
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_NFC = "android.hardware.nfc";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports host-
* based NFC card emulation.
*
* TODO remove when depending apps have moved to new constant.
* @hide
* @deprecated
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_NFC_HCE = "android.hardware.nfc.hce";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports host-
* based NFC card emulation.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes an accelerometer.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_ACCELEROMETER = "android.hardware.sensor.accelerometer";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a barometer (air
* pressure sensor.)
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_BAROMETER = "android.hardware.sensor.barometer";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a magnetometer (compass).
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_COMPASS = "android.hardware.sensor.compass";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a gyroscope.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_GYROSCOPE = "android.hardware.sensor.gyroscope";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a light sensor.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_LIGHT = "android.hardware.sensor.light";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a proximity sensor.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_PROXIMITY = "android.hardware.sensor.proximity";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a hardware step counter.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_STEP_COUNTER = "android.hardware.sensor.stepcounter";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes a hardware step detector.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SENSOR_STEP_DETECTOR = "android.hardware.sensor.stepdetector";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a telephony radio with data
* communication support.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY = "android.hardware.telephony";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a CDMA telephony stack.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY_CDMA = "android.hardware.telephony.cdma";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device has a GSM telephony stack.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEPHONY_GSM = "android.hardware.telephony.gsm";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports connecting to USB devices
* as the USB host.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_USB_HOST = "android.hardware.usb.host";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports connecting to USB accessories.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_USB_ACCESSORY = "android.hardware.usb.accessory";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The SIP API is enabled on the device.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SIP = "android.software.sip";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports SIP-based VOIP.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SIP_VOIP = "android.software.sip.voip";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's display has a touch screen.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TOUCHSCREEN = "android.hardware.touchscreen";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's touch screen supports
* multitouch sufficient for basic two-finger gesture detection.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's touch screen is capable of
* tracking two or more fingers fully independently.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device's touch screen is capable of
* tracking a full hand of fingers fully independently -- that is, 5 or
* more simultaneous independent pointers.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND = "android.hardware.touchscreen.multitouch.jazzhand";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device does not have a touch screen, but
* does support touch emulation for basic events. For instance, the
* device might use a mouse or remote control to drive a cursor, and
* emulate basic touch pointer events like down, up, drag, etc. All
* devices that support android.hardware.touchscreen or a sub-feature are
* presumed to also support faketouch.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_FAKETOUCH = "android.hardware.faketouch";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device does not have a touch screen, but
* does support touch emulation for basic events that supports distinct
* tracking of two or more fingers. This is an extension of
* {@link #FEATURE_FAKETOUCH} for input devices with this capability. Note
* that unlike a distinct multitouch screen as defined by
* {@link #FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT}, these kinds of input
* devices will not actually provide full two-finger gestures since the
* input is being transformed to cursor movement on the screen. That is,
* single finger gestures will move a cursor; two-finger swipes will
* result in single-finger touch events; other two-finger gestures will
* result in the corresponding two-finger touch event.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT = "android.hardware.faketouch.multitouch.distinct";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device does not have a touch screen, but
* does support touch emulation for basic events that supports tracking
* a hand of fingers (5 or more fingers) fully independently.
* This is an extension of
* {@link #FEATURE_FAKETOUCH} for input devices with this capability. Note
* that unlike a multitouch screen as defined by
* {@link #FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND}, not all two finger
* gestures can be detected due to the limitations described for
* {@link #FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT}.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND = "android.hardware.faketouch.multitouch.jazzhand";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports portrait orientation
* screens. For backwards compatibility, you can assume that if neither
* this nor {@link #FEATURE_SCREEN_LANDSCAPE} is set then the device supports
* both portrait and landscape.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SCREEN_PORTRAIT = "android.hardware.screen.portrait";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports landscape orientation
* screens. For backwards compatibility, you can assume that if neither
* this nor {@link #FEATURE_SCREEN_PORTRAIT} is set then the device supports
* both portrait and landscape.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_SCREEN_LANDSCAPE = "android.hardware.screen.landscape";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports live wallpapers.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_LIVE_WALLPAPER = "android.software.live_wallpaper";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports app widgets.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_APP_WIDGETS = "android.software.app_widgets";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports a home screen that is replaceable
* by third party applications.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_HOME_SCREEN = "android.software.home_screen";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports adding new input methods implemented
* with the {@link android.inputmethodservice.InputMethodService} API.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_INPUT_METHODS = "android.software.input_methods";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports device policy enforcement via device admins.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_DEVICE_ADMIN = "android.software.device_admin";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports WiFi (802.11) networking.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_WIFI = "android.hardware.wifi";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports Wi-Fi Direct networking.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_WIFI_DIRECT = "android.hardware.wifi.direct";
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: This is a device dedicated to showing UI
* on a television. Television here is defined to be a typical living
* room television experience: displayed on a big screen, where the user
* is sitting far away from it, and the dominant form of input will be
* something like a DPAD, not through touch or mouse.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_TELEVISION = "android.hardware.type.television";
在\frameworks\base\core\java\android\content\pm\PackageManager的hasSystemFeature(name)方法用来查询系统是否具备某特性。
/**
* Check whether the given feature name is one of the available
* features as returned by {@link #getSystemAvailableFeatures()}.
*
* @return Returns true if the devices supports the feature, else
* false.
*/
public abstract boolean hasSystemFeature(String name);
而这个方法实际上调用到文件frameworks\base\services\Java\com\android\server\pm\PackageManagerService.java 的方法:
public boolean hasSystemFeature(String name) {
synchronized (mPackages) {
return mAvailableFeatures.containsKey(name);
}
}
3. UserRestriction
UserRestiction是多用户模式下对用户权限的限制,虽然android4.4支持多用户模式,但手机终端并没有开放这项功能,在android5.0之后才开放,好像是因为专利的问题。但基于系统的开发,是可以调用这项功能的。
源代码主要位于\frameworks\base\core\java\android\os\UserManager.java
/**
* Key for user restrictions. Specifies if a user is disallowed from adding and removing
* accounts.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
/**
* Key for user restrictions. Specifies if a user is disallowed from changing Wi-Fi
* access points.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_CONFIG_WIFI = "no_config_wifi";
/**
* Key for user restrictions. Specifies if a user is disallowed from installing applications.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_INSTALL_APPS = "no_install_apps";
/**
* Key for user restrictions. Specifies if a user is disallowed from uninstalling applications.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
/**
* Key for user restrictions. Specifies if a user is disallowed from toggling location sharing.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_SHARE_LOCATION = "no_share_location";
/**
* Key for user restrictions. Specifies if a user is disallowed from enabling the
* "Unknown Sources" setting, that allows installation of apps from unknown sources.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
/**
* Key for user restrictions. Specifies if a user is disallowed from configuring bluetooth.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth";
/**
* Key for user restrictions. Specifies if a user is disallowed from transferring files over
* USB. The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
/**
* Key for user restrictions. Specifies if a user is disallowed from configuring user
* credentials. The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
/**
* Key for user restrictions. Specifies if a user is disallowed from removing users.
* The default value is false
.
*
* Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
*/
public static final String DISALLOW_REMOVE_USER = "no_remove_user";
上述罗列的是android4.4.4_r1,在android5.0中Restriction项会丰富很多。
UserRestriction的判定由 UserManager.java文件的下述方法:
/**
* Returns the user-wide restrictions imposed on the user specified by userHandle
.
* @param userHandle the UserHandle of the user for whom to retrieve the restrictions.
* @return a Bundle containing all the restrictions.
*/
public Bundle getUserRestrictions(UserHandle userHandle) {
try {
return mService.getUserRestrictions(userHandle.getIdentifier());
} catch (RemoteException re) {
Log.w(TAG, "Could not get user restrictions", re);
return Bundle.EMPTY;
}
}
4 QuickSettings修改
依据接口功能配置,隐藏部分接口给用户,因此需要修改QuickSettings以及Settings部分UI代码。
QuickSettings的配置项加载是调用\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\QuickSettingsControllers.java loadTiles()方法,加入判断SystemFeature或者UserRestriction来判断是否加载某配置项。
另外,android为用户提供了配置QuickSettings项的界面,可增删配置项。
在\leadcore\third-pkages\apps\Settings\src\com\android\settings\quickSettings\QuickSettingsUtil.java的registerTile()方法,加入判断SystemFeature或者UserRestriction来判断是否加载某配置项。
5.Settings的修改
在\leadcore\third-pkages\apps\Settings\src\com\android\settings\Settings.java的updateHeaderList()方法,加判断SystemFeature或者UserRestriction来判断是否加载某配置项。