안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
혹시 터치이벤트를 강제로 발생 시키는것에 대해 아시는분 안계실까요?
안드로이드 vnc소스를 가지고 샘플을 만들었는데요.
(ndk)
소스를 보면
1. init_touch()
50. injectTouchEvent(int down, int x, int y);
99. cleanup_touch()
1번 후에 50번 작업을 계속 던지는데 아무런 작동도 하지 않거든요...
루팅해서 각 /dev/input/아래 있는것들은 권한오류 없이 정상으로 열렸구요.
write했을 경우에도 아무런 에러가 없습니다.
근데 아무런 현상이 안나오고 있습니다.
도움 주실분 안계실까요?
읽어 주셔서 감사합니다.
-------------------------------------------------------------------
static char TOUCH_DEVICE[256] = "/dev/input/event1";
static int init_touch()
{
struct input_absinfo info;
if((touchfd = open(TOUCH_DEVICE, O_RDWR)) == -1)
{
sprintf(gMsg, "cannot open touch device ( %s )", strerror(errno));
LOGI("cannot open touch device ( %s )\n", strerror(errno));
return -1;
}
// Get the Range of X and Y
if(ioctl(touchfd, EVIOCGABS(ABS_X), &info)) {
sprintf(gMsg, "cannot get ABS_X info, %s", strerror(errno));
LOGI("cannot get ABS_X info, %s\n", strerror(errno));
return -2;
}
xmin = info.minimum;
xmax = info.maximum;
if(ioctl(touchfd, EVIOCGABS(ABS_Y), &info)) {
sprintf(gMsg, "cannot get ABS_Y, %s", strerror(errno));
LOGI("cannot get ABS_Y, %s\n", strerror(errno));
return -3;
}
ymin = info.minimum;
ymax = info.maximum;
LOGI("xmin:%d, xmax:%d, ymin:%d, ymax:%d", xmin, xmax, ymin, ymax);
//xmin : 0, xmax : 599, ymin : 0, ymax : 1023
return 1;
}
static void cleanup_touch()
{
if(touchfd != -1)
{
close(touchfd);
touchfd = -1;
}
}
void injectTouchEvent(int down, int x, int y)
{
struct input_event ev;
// Calculate the final x and y
//x = xmin + (x * (xmax - xmin)) / (scrinfo.xres);
//y = ymin + (y * (ymax - ymin)) / (scrinfo.yres);
//LOGI("down:%d, x:%d, y:%d", down, x, y);
memset(&ev, 0, sizeof(ev));
// Then send a BTN_TOUCH
gettimeofday(&ev.time,0);
ev.type = EV_KEY;
ev.code = BTN_TOUCH;
ev.value = down;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Then send the X
gettimeofday(&ev.time,0);
ev.type = EV_ABS;
ev.code = ABS_X;
ev.value = x;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Then send the Y
gettimeofday(&ev.time,0);
ev.type = EV_ABS;
ev.code = ABS_Y;
ev.value = y;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Finally send the SYN
gettimeofday(&ev.time,0);
ev.type = EV_SYN;
ev.code = 0;
ev.value = 0;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
}
혹시 터치이벤트를 강제로 발생 시키는것에 대해 아시는분 안계실까요?
안드로이드 vnc소스를 가지고 샘플을 만들었는데요.
(ndk)
소스를 보면
1. init_touch()
50. injectTouchEvent(int down, int x, int y);
99. cleanup_touch()
1번 후에 50번 작업을 계속 던지는데 아무런 작동도 하지 않거든요...
루팅해서 각 /dev/input/아래 있는것들은 권한오류 없이 정상으로 열렸구요.
write했을 경우에도 아무런 에러가 없습니다.
근데 아무런 현상이 안나오고 있습니다.
도움 주실분 안계실까요?
읽어 주셔서 감사합니다.
-------------------------------------------------------------------
static char TOUCH_DEVICE[256] = "/dev/input/event1";
static int init_touch()
{
struct input_absinfo info;
if((touchfd = open(TOUCH_DEVICE, O_RDWR)) == -1)
{
sprintf(gMsg, "cannot open touch device ( %s )", strerror(errno));
LOGI("cannot open touch device ( %s )\n", strerror(errno));
return -1;
}
// Get the Range of X and Y
if(ioctl(touchfd, EVIOCGABS(ABS_X), &info)) {
sprintf(gMsg, "cannot get ABS_X info, %s", strerror(errno));
LOGI("cannot get ABS_X info, %s\n", strerror(errno));
return -2;
}
xmin = info.minimum;
xmax = info.maximum;
if(ioctl(touchfd, EVIOCGABS(ABS_Y), &info)) {
sprintf(gMsg, "cannot get ABS_Y, %s", strerror(errno));
LOGI("cannot get ABS_Y, %s\n", strerror(errno));
return -3;
}
ymin = info.minimum;
ymax = info.maximum;
LOGI("xmin:%d, xmax:%d, ymin:%d, ymax:%d", xmin, xmax, ymin, ymax);
//xmin : 0, xmax : 599, ymin : 0, ymax : 1023
return 1;
}
static void cleanup_touch()
{
if(touchfd != -1)
{
close(touchfd);
touchfd = -1;
}
}
void injectTouchEvent(int down, int x, int y)
{
struct input_event ev;
// Calculate the final x and y
//x = xmin + (x * (xmax - xmin)) / (scrinfo.xres);
//y = ymin + (y * (ymax - ymin)) / (scrinfo.yres);
//LOGI("down:%d, x:%d, y:%d", down, x, y);
memset(&ev, 0, sizeof(ev));
// Then send a BTN_TOUCH
gettimeofday(&ev.time,0);
ev.type = EV_KEY;
ev.code = BTN_TOUCH;
ev.value = down;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Then send the X
gettimeofday(&ev.time,0);
ev.type = EV_ABS;
ev.code = ABS_X;
ev.value = x;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Then send the Y
gettimeofday(&ev.time,0);
ev.type = EV_ABS;
ev.code = ABS_Y;
ev.value = y;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
// Finally send the SYN
gettimeofday(&ev.time,0);
ev.type = EV_SYN;
ev.code = 0;
ev.value = 0;
if(write(touchfd, &ev, sizeof(ev)) < 0)
{
sprintf(gMsg, "write event failed, %s(injectTouchEvent)", strerror(errno));
LOGI("write event failed, %s(injectTouchEvent)\n", strerror(errno));
}
}