
android觸摸屏idc,Androididc?件配置
1.idc是什么?
idc 是Input Device Configuration的縮寫,輸?設備配置?件(.idc ?件)包含特定設備的配置屬性,這些屬性會影響輸?設備的?為。
輸?設備配置?件通常并?標準外圍設備(例如 HID 鍵盤和?標)所必需的,因為默認的系統?為通常可確保它們即插即?。另???,內置的嵌?式設備(尤其是觸摸屏)?乎總是需要輸?設備配置?件來指定其?為。
2.idc位置按順序查閱以下路徑。
/odm/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/
odm/usr/idc/Vendor_XXXX_Product_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc
/odm/usr/idc/device-name.idc
/vendor/usr/idc/device-name.idc
/system/usr/idc/device-name.idc
/data/system/devices/idc/device-name.idc
當構建包含設備名稱的?件路徑時,設備名稱中除“0-9”、“a-z”、“A-Z”、“-”或“_”之外的所有字符將替換為“_”。
3.idc?件常?配置屬性
#=0 外部設備 =1內部設備
device.internal = 0
#定義:keyboard.layout = #指定與輸?設備關聯的鍵布局?件的名稱,不包括.kl擴展名。 如果找不到此?件,輸?系統將使?默認鍵布局。
keyboard.layout = qwerty
#定義:keyboard.characterMap = #指定與輸?設備關聯的鍵字符映射?件的名稱,不包括.kcm擴展名。 如果找不到此?件,輸?系統將使?默認的鍵字符映射。
#在查找期間,名稱中的空格將轉換為下劃線。
keyboard.characterMap = qwerty
#定義:ientationAware = 0 |1
#指定鍵盤是否應對顯??向更改做出反應。
#如果值為1,則在關聯的顯??向改變時旋轉?向鍵盤鍵。
#如果值為0,則鍵盤不受顯??向更改的影響。
#默認值為0。
#?向感知?于?持?向鍵盤鍵的旋轉,例如Motorola Droid上的旋轉。 例如,當設備從其?然?向順時針旋轉90度時,
#KEYCODE_DPAD_UP被重新映射以產?KEYCODE_DPAD_RIGHT,因為當設備保持在該?向時,“向上”鍵最終指向“右”。
#定義:keyboard.builtIn = 0 |1
#指定鍵盤是否為內置(物理連接)鍵盤。
#如果設備名稱以-keypad結尾,則默認值為1,否則為0。
#內置鍵盤的設備ID始終為0.其他?內置鍵盤將分配唯?的?零設備ID。
#對于內置鍵盤使?id為0對于保持與KeyCharacterMap.BUILT_IN_KEYBOARD字段的兼容性?常重要,該字段指定內置鍵盤的id并且值為0.
#此字段已在API中棄?但較舊 應?程序可能仍在使?它。
#?論此屬性的設置如何,特殊功能鍵盤(其鍵字符映射指定SPECIAL_FUNCTION的類型)將永遠不會注冊為內置鍵盤。
#這是因為根據定義,特殊功能鍵盤不打算?于通?鍵?。
keyboard.builtIn = 1
4.idc代碼流程
Eventhub在打開設備時會讀取設備的idc?件
->Eventhub.openDeviceLocked->loadConfigurationLocked
void EventHub::loadConfigurationLocked(Device* device) {
device->configurationFile = getInputDeviceConfigurationFilePathByDeviceIdentifier(
device->identifier, INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION);
if (device->configurationFile.isEmpty()) {
ALOGD("No input device configuration file found for device '%s'.",
device->identifier.name.string());
} el {
status_t status = PropertyMap::load(device->configurationFile,
&device->configuration);
if (status) {
ALOGE("Error loading input device configuration file for device '%s'.? "
"Using default configuration.",
device->identifier.name.string());
}
}
}
idc?件的加載順序如下,如果找到了idc?件則直接返回不會再加載后?的idc?件
Vendor_XXXX_Product_XXXX_Version_XXXX.idc
Vendor_XXXX_Product_XXXX.idc
device-name.idc
String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
const InputDeviceIdentifier& deviceIdentifier,
InputDeviceConfigurationFileType type) {
if (deviceIdentifier.vendor !=0 && deviceIdentifier.product != 0) {
if (deviceIdentifier.version != 0) {
// Try vendor product version.
String8 versionPath(getInputDeviceConfigurationFilePathByName(
String8::format("Vendor_%04x_Product_%04x_Version_%04x", deviceIdentifier.vendor, deviceIdentifier.product,
deviceIdentifier.version),
type));
if (!versionPath.isEmpty()) {
return versionPath;
}
}
// Try vendor product.
String8 productPath(getInputDeviceConfigurationFilePathByName(
String8::format("Vendor_%04x_Product_%04x",
deviceIdentifier.vendor, deviceIdentifier.product),
type));
if (!productPath.isEmpty()) {
return productPath;
}
}
// Try device name.
return getInputDeviceConfigurationFilePathByName(deviceIdentifier.name, type); }
String8 getInputDeviceConfigurationFilePathByName(
const String8& name, InputDeviceConfigurationFileType type) {
// Search system repository.
String8 path;
path.tTo(getenv("ANDROID_ROOT"));
path.append("/usr/");
appendInputDeviceConfigurationFileRelativePath(path, name, type);
#if DEBUG_PROBE
ALOGD("Probing for system provided input device configuration file: path='%s'", path.string()); #endif
if (!access(path.string(), R_OK)) {
#if DEBUG_PROBE
ALOGD("Found");
#endif
return path;
}
// Search ur repository.
// TODO Should only look here if not in safe mode.
path.tTo(getenv("ANDROID_DATA"));
path.append("/system/devices/");
appendInputDeviceConfigurationFileRelativePath(path, name, type);
#if DEBUG_PROBE
ALOGD("Probing for system ur input device configuration file: path='%s'", path.string());
#endif
if (!access(path.string(), R_OK)) {
#if DEBUG_PROBE
ALOGD("Found");
#endif
return path;
}
// Not found.
#if DEBUG_PROBE
ALOGD("Probe failed to find input device configuration file: name='%s', type=%d",
name.string(), type);
#endif
return String8();
}
參考博客: