Android N之hasSystemFeature
来源:互联网 发布:mr数据与信令相关联 编辑:程序博客网 时间:2024/05/22 12:17
当我们判断某一功能打开与否时,一般会有个确认本功能是否支持的过程,以便与为相关的功能初始化其他的环境,例如:蓝牙/NFC。
例如,NFC HCE
两个的声明如下:
/** * 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 */ @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 supports host- * based NFC-F card emulation. */ @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
针对“android.hardware.nfc.hce”,有两个静态变量对应,其中一个已经过时,但是为了兼容老版本,仍做保留。
这些feature的出处来自与SystemConfig
public PackageManagerService(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis()); /** M: Mtprof tool @{ */ //mMTPROFDisable = "1".equals(SystemProperties.get("ro.mtprof.disable")); mMTPROFDisable = false; addBootEvent("Android:PackageManagerService_Start"); /** @} */ if (mSdkVersion <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); } //...... mOnPermissionChangeListeners = new OnPermissionChangeListeners( FgThread.get().getLooper()); getDefaultDisplayMetrics(context, mMetrics); SystemConfig systemConfig = SystemConfig.getInstance(); mGlobalGids = systemConfig.getGlobalGids(); mSystemPermissions = systemConfig.getSystemPermissions(); mAvailableFeatures = systemConfig.getAvailableFeatures();//来源 } @Override public boolean hasSystemFeature(String name, int version/*0*/) { synchronized (mPackages) { final FeatureInfo feat = mAvailableFeatures.get(name); if (feat == null) { return false; } else { return feat.version >= version; } } }
由以上知,hasSystemFeature实质上是通过PackagesManagerService从SystemConfig读取到的mAvailableFeatures中查询是否存在,或者版本更新。
那么SystemConfig又是从哪里读取到的呢?
public static SystemConfig getInstance() { synchronized (SystemConfig.class) { if (sInstance == null) { sInstance = new SystemConfig(); } return sInstance; } }
SystemConfig是个单例
从以上可知,SystemConfig是从/system/etc/和/oem/etc/目录下的sysconfig或者permission中扫描读取文件内容,看是否具有相关的"feature"。
经查,上述3个NFC相关的feature定义均位于/system/etc/permission中,蓝牙相关的bluetooth和bluetooth_le也在其中,/oem目录下为空。
挑其中一个看看,android.hardware.nfc.hce.xml:
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2013 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.--><!-- This feature indicates that the device supports host-based NFC card emulation --><permissions> <feature name="android.hardware.nfc.hce" /></permissions>
那么这些/system/etc/permission中的xml文件最终来源是哪儿呢 ?
答案是:frameworks/native/data/etc/中定义,编译目标的宏控制是否加入编译目标。
编译系统如下:
PRODUCT_COPY_FILES += \ $(NFCEE_ACCESS_PATH):system/etc/nfcee_access.xml \ frameworks/native/data/etc/android.hardware.nfc.xml:system/etc/permissions/android.hardware.nfc.xml \ frameworks/native/data/etc/android.hardware.nfc.hce.xml:system/etc/permissions/android.hardware.nfc.hce.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.bluetooth.xml:system/etc/permissions/android.hardware.bluetooth.xmlPRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.bluetooth_le.xml:system/etc/permissions/android.hardware.bluetooth_le.xml
阅读全文
0 0
- Android N之hasSystemFeature
- android hasSystemFeature函数
- android hasSystemFeature函数
- android Device Admin以及hasSystemFeature(String string)
- android hasSystemFeature函数及系统特性配置
- android-getPackageManager().hasSystemFeature(String string)的应用
- PackageManager hasSystemFeature
- Android N Graphics之BitmapFactory
- Android N 之 重要的开发者功能
- Android N 之 Java 8 语言功能
- [Android N]MediaRecorder系列之初识mediaRecorder
- Android N Graphics之FrameBuffer驱动分析
- Android之Android N 上的notification归类功能
- android N
- Android N
- Android N
- Android编程之Listener侦听的N种写法
- Android N之SurfaceFlinger流程解析(1)
- Android 7.0拍照权限处理
- 剑指offer 平衡二叉树
- 解密:天猫双十一1682亿背后的“霸下-七层流量清洗”系统
- 分布式消息中间件MQ简单介绍
- Android 开发 新技术
- Android N之hasSystemFeature
- 数据结构上机——队列
- C++基本操作(一):string
- 写日志 和 动态创建jpg,保存
- HTML5 websock
- tensorflow中的CRF
- 11月17日云栖精选夜读:继浸没液冷后,阿里再推国内首个锂电池服务器
- thinkphp 模板时间操作、字符切割 条件判断
- Excel在统计分析中的应用—第七章—参数估计-总体均值的估计(总体方差已知下的估计)