学习记录:接口功能配置之 Settings及QuickSettings

来源:互联网 发布:淘宝 安能小包发货 编辑:程序博客网 时间:2024/06/09 22:14

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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>false</code>.     * <p/>     * 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 <code>userHandle</code>.     * @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来判断是否加载某配置项。