在双屏异显产品中,有时候主副屏都带有触摸屏,并且要求主副屏触摸各自操作互不干扰。

Android 现有框架中已经支持副输入设备的逻辑,只是默认将所有的外部热插拔设备统一指定为副输入设备,这种逻辑我们如果是一个 i2c 加上一个 usb 触摸那么默认就可以支持,usb触摸就是副tp。

但,有时候我们是双 i2c 或双 usb 的搭配,我们就需要改造现有逻辑,方案如下:

通过属性配置副屏 tp 的: 设备名、pid&vid、usb端口,在 EventHub 中获取输入设备的设备名、pid&vid、usb端口与属性值进行对比,如果是配置中的设备就将其标记为副输入设备。

源码

实现

diff --git a/frameworks/native/services/inputflinger/EventHub.cpp b/frameworks/native/services/inputflinger/EventHub.cpp

old mode 100644

new mode 100755

index 2bcc5c7..1542a7b

--- a/frameworks/native/services/inputflinger/EventHub.cpp

+++ b/frameworks/native/services/inputflinger/EventHub.cpp

@@ -64,6 +64,11 @@

#define INDENT2 " "

#define INDENT3 " "

+// for multi touch panel

+#define DEVICE_MATCH_METHOD_MAX 10

+#define USB_LOCATION_MATCH_START 13 //"usb-ff540000."

+#define USB_LOCATION_MATCH_LEN 7 //"usb-1.1"

+

namespace android {

static const char *WAKE_LOCK_ID = "KeyEvents";

@@ -1184,17 +1189,17 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {

int32_t deviceId = mNextDeviceId++;

Device* device = new Device(fd, deviceId, String8(devicePath), identifier);

- ALOGV("add device %d: %s\n", deviceId, devicePath);

- ALOGV(" bus: %04x\n"

+ ALOGI("add device %d: %s\n", deviceId, devicePath);

+ ALOGI(" bus: %04x\n"

" vendor %04x\n"

" product %04x\n"

" version %04x\n",

identifier.bus, identifier.vendor, identifier.product, identifier.version);

- ALOGV(" name: \"%s\"\n", identifier.name.string());

- ALOGV(" location: \"%s\"\n", identifier.location.string());

- ALOGV(" unique id: \"%s\"\n", identifier.uniqueId.string());

- ALOGV(" descriptor: \"%s\"\n", identifier.descriptor.string());

- ALOGV(" driver: v%d.%d.%d\n",

+ ALOGI(" name: \"%s\"\n", identifier.name.string());

+ ALOGI(" location: \"%s\"\n", identifier.location.string());

+ ALOGI(" unique id: \"%s\"\n", identifier.uniqueId.string());

+ ALOGI(" descriptor: \"%s\"\n", identifier.descriptor.string());

+ ALOGI(" driver: v%d.%d.%d\n",

driverVersion >> 16, (driverVersion >> 8) & 0xff, driverVersion & 0xff);

// Load the configuration file for the device.

@@ -1357,10 +1362,35 @@ status_t EventHub::openDeviceLocked(const char *devicePath) {

}

// Determine whether the device is external or internal.

- if (isExternalDeviceLocked(device)) {

+ if((device->classes & 0x04) == INPUT_DEVICE_CLASS_TOUCH) {

+ int count = 0;

+ char flag[DEVICE_MATCH_METHOD_MAX][PROPERTY_VALUE_MAX];

+ char value[PROPERTY_VALUE_MAX] = {0};

+

+ property_get("ro.input.external", value, "");

+

+ if (isExternalDeviceLocked(device)) {

+ sprintf(flag[count++], "%04x:%04x", identifier.vendor, identifier.product);

+ if (identifier.location.length() >= USB_LOCATION_MATCH_START+USB_LOCATION_MATCH_LEN) {

+ strncpy(flag[count++], identifier.location.string()+USB_LOCATION_MATCH_START, USB_LOCATION_MATCH_LEN);

+ }

+ } else {

+ sprintf(flag[count++], "%s", device->identifier.name.string());

+ }

+

+ for (int i=0; i

+ ALOGI("openDeviceLocked:%d, value=%s flag=%s\n", __LINE__, value, flag[i]);

+ if (strstr(value, flag[i])) {

+ device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;

+ ALOGI("openDeviceLocked:%d, name:\"%s\" id:%d device_class:%x vid:%04x pid:%04x is external input device\n",

+ __LINE__, device->identifier.name.string(), device->id, device->classes, identifier.vendor, identifier.product);

+ break;

+ }

+ }

+ } else {

device->classes |= INPUT_DEVICE_CLASS_EXTERNAL;

}

-

+

if (device->classes & (INPUT_DEVICE_CLASS_JOYSTICK | INPUT_DEVICE_CLASS_DPAD)

&& device->classes & INPUT_DEVICE_CLASS_GAMEPAD) {

device->controllerNumber = getNextControllerNumberLocked(device);

属性配置格式说明

属性名:ro.input.external

属性值:

设备类型

格式

例如

usb

vid:pid

222a:0001

usb

usb端口

usb-1.4

i2c

设备名

Hanvon electromagnetic pen

也可以同时配置多个设备,各属性值之间用“,”隔开。

例如:

ro.input.external=222a:0001,Hanvon electromagnetic pen,usb-1.4

以上属性配置“vid=222a,pid=0001”的 usb tp 和设备名为“Hanvon electromagnetic pen”的 i2c tp 以及 usb 端口为 1.4 的 tp 为副屏 tp,其它未配置的都默认为主屏 tp。

android+双屏触摸,双屏异触 --- 实现指定触摸为副屏触摸功能相关推荐

  1. 双屏异触 --- 实现指定触摸为副屏触摸功能

    在双屏异显产品中,有时候主副屏都带有触摸屏,并且要求主副屏触摸各自操作互不干扰. Android 现有框架中已经支持副输入设备的逻辑,只是默认将所有的外部热插拔设备统一指定为副输入设备,这种逻辑我们如 ...

  2. android双屏不同apk,android rk3288 rk3399 双屏双触 双屏异显 验证apk

    [实例简介] android rk3288 rk3399 双屏双触 双屏异显 验证apk,android rk3288 rk3399 双屏双触 双屏异显 验证apk,android rk3288 rk ...

  3. RK3399开发版android7.1双屏异触解决方法

    最近大半个月一直在折腾Firefly-RK3399开发板实现双屏异显和异触的功能.在这里不得不吐槽一下萤火虫的售后服务支持!额???所谓的官方群和论坛形同摆设,在里面10个人的问题中有一个人能得到回答 ...

  4. [高通SDM450][Android9.0]双屏异显、双屏异触

    文章目录 开发平台基本信息 问题描述 解决方法 双屏异显 双屏异触 延伸扩展 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 公司有一 ...

  5. android 10.0 双屏异显(1)

    在android10.0上做双屏异显快一年了,现在做一个总结:便于以后查看,也便于做异显的兄弟借鉴及共同探讨. 一.android 起来默认为异显模式,并且SystemUI 与键盘启动异显. 添加文件 ...

  6. [RK3568 Android11] 教程之双屏异显指定主副屏

    目录 一.双屏异显前提 二.指定主副屏 三.双MIPI主副屏配置 一.双屏异显前提 在指定双屏异显主副屏前,说明下双屏显示:底层需要分别调试好双屏都能正常显示,并且都分别挂载在不同的VP上:      ...

  7. 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )

    文章目录 I . 多点触控事件 II . PointerId 与 PointerIndex 简介 III . 本次 PointerId 与 PointerIndex 获取 IV . PointerId ...

  8. Android App接管手势处理TouchEvnet中单点触摸和多点触控的讲解及实战(附源码 超简单实用)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.单点触摸 dispatchTouchEvent onInterceptTouchEvent onTouchEvent三个方法的输入参数都是手势 ...

  9. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

最新文章

  1. 时间序列数据库概览——基于文件(RRD)、K/V数据库(influxDB)、关系型数据库...
  2. 用python排教室_开学季,教你用Python画大学教室座位神分区图!网友直呼“中枪”...
  3. 2018,抢票大作战
  4. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
  5. 一般线性模型和混合线性模型_线性混合模型如何工作
  6. 如何构建一个向导操作模式程序
  7. 搭建大数据运行环境之一
  8. 【抢购仅限1500册】2019年入门必备Linux系统自学书籍半价促销。
  9. Android Studio工程中添加移动广告平台广告条代码教程
  10. net.sf.json与fastjson两种jar包的使用
  11. Luogu1502 窗口的星星
  12. Video.js - HTML5 视频播放器
  13. 抖音视频怎么下载MP4格式怎么转换为MP3
  14. idea一顿切换分之后编译项目提示找不到其他分支类的解决办法~
  15. node启动服务报错Error: listen EADDRNOTAVAIL 192.168.1.137:8023
  16. [Vmware]VCSA部署及遇到的问题
  17. 晶振旁的电阻(并联与串联)和电容的作用
  18. 超文本标记语言是指Java_超文本标记语言(HTML)
  19. 【第五篇】Maven系列教程-聚合工程
  20. std::mismatch 用法

热门文章

  1. dataV教程-浅用dataV
  2. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
  3. c语言小练pintia1-10
  4. Overleaf编译出现的问题
  5. [NOI2005]瑰丽华尔兹(DP+单调队列优化)
  6. Discuz二次元风格模板源码
  7. EMQ X Enterprise 新版本:新增车联网行业 GB/T32960 协议支持
  8. 聊天室html布局,h5聊天室模板|仿微信聊天室html5
  9. Android RxJava操作符的学习---组合 / 合并操作符
  10. 项目管理中对个人能力的要求