是否支持通过 ADB 模拟 Android 设备的物理按键操作

希望通过 ADB 模拟 Android 设备的物理按键操作,发现没反应,是否是不支持,如电源键、音量键
比如电源键: adb shell input keyevent 26
image

adb shell input 命令在 linux 镜像中并不支持, 可以试试使用 /dev/uinput 节点达到类似的模拟效果

另外还请教一下,getevent,setevent怎么使用呢

请问您使用的是linux系统吗?getevent可以集成开源的第三方工具

是的,使用的是这个
image
,我这边在ubuntu里编译好后推进去发现不行,请问第三方工具有推荐的吗,编译要按yocto 下才行?

这个功能在我们的技术团队的开发规划中,您可以关注后续release信息,也可按照yocto开发方式自行移植,未发布的功能我们无法提供更多支持

/dev/uinput , 我用以下代码控制不了两灭屏,是指令不对还是哪里不对呢?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/uinput.h>
#include <sys/ioctl.h>
#include <stdlib.h>

#define DIE(str, args…) do { perror(str); exit(EXIT_FAILURE); } while(0)

int setup_uinput_device(int *fd) {
struct uinput_user_dev uidev;

*fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if (*fd < 0)
    DIE("open /dev/uinput");

// 支持EV_KEY事件和KEY_POWER键
if (ioctl(*fd, UI_SET_EVBIT, EV_KEY) < 0)
    DIE("ioctl EV_KEY");
if (ioctl(*fd, UI_SET_KEYBIT, KEY_POWER) < 0)
    DIE("ioctl KEY_POWER");

memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "virtual-power-key");
uidev.id.bustype = BUS_USB;
uidev.id.vendor  = 0x1234;
uidev.id.product = 0x5678;
uidev.id.version = 1;

if (write(*fd, &uidev, sizeof(uidev)) < 0)
    DIE("write device");

if (ioctl(*fd, UI_DEV_CREATE) < 0)
    DIE("ioctl UI_DEV_CREATE");

return 0;

}

void emit(int fd, int type, int code, int val) {
struct input_event ev;
memset(&ev, 0, sizeof(ev));
gettimeofday(&ev.time, NULL);
ev.type = type;
ev.code = code;
ev.value = val;
if(write(fd, &ev, sizeof(ev)) < 0)
DIE(“write event”);
}

void power_key_press(int fd) {
emit(fd, EV_KEY, KEY_POWER, 1); // 按下
emit(fd, EV_SYN, SYN_REPORT, 0); // 同步
}

void power_key_release(int fd) {
emit(fd, EV_KEY, KEY_POWER, 0); // 松开
emit(fd, EV_SYN, SYN_REPORT, 0); // 同步
}

int main(int argc, char* argv) {
if(argc != 2) {
printf(“Usage: %s <on|off>\n”, argv[0]);
return 1;
}

int fd;
setup_uinput_device(&fd);

if(strcmp(argv[1], "on") == 0) {
    // 模拟亮屏(按电源键)
    power_key_press(fd);
    usleep(150000);   // 按下持续时间
    power_key_release(fd);
    printf("Screen ON event sent\n");
} else if(strcmp(argv[1], "off") == 0) {
    // 模拟灭屏(按电源键)
    power_key_press(fd);
    usleep(150000);  // 按下持续时间
    power_key_release(fd);
    printf("Screen OFF event sent\n");
} else {
    fprintf(stderr, "Unknown argument: %s\n", argv[1]);
    ioctl(fd, UI_DEV_DESTROY);
    close(fd);
    return 1;
}

ioctl(fd, UI_DEV_DESTROY);
close(fd);
return 0;

}

我们的技术团队正在调查中,会尽快回复您
另外,请问您“模拟设备物理按键”需求的原因是什么?是因为给rubikpi设备套了外壳把按键盖住了吗?

验证drm功能,外壳没盖住,按了pwr 键没反应所以才改用指令去切换

请问具体遇到了什么问题?
按了pwr 键屏幕没亮/没关?

按了pwr 键屏幕没关,用的网站提供的linux镜像

按了pwr 键屏幕没关–>请问指的是hdmi out吗
如果您只想关屏可以给设备连一个键盘然后使用快捷键:Ctrl + Alt + Backspace
亮屏:#weston --tty=1 --idle-time=0 &

用上面指令试了也是没反应

请问rubikpi有连接键盘吗
具体是关的时候没反应?还是开的时候没反应?有报错信息吗

有链接键盘,使用上面提供 的快捷键:Ctrl + Alt + Backspace 关屏,由于关屏没反应,所以不确定亮屏是否也是无效。我这边用getevent 查看了
1、按Ctrl+ alt+backspace 事件,有事件屏幕仍然一直保持亮屏:

2、按pwr键的效果,是有power on/off的,但是屏幕依然是保持亮屏,以下是按pwr键抓的事件:

Dear customer,
我们这边使用linux1.1版本做测试是可以通过快捷键关屏的,请您检查一下快捷键设置
另外,请问您使用的电脑是什么系统?

电脑用的win 10. 连接键盘按快捷键:Ctrl + Alt + Backspace这个跟电脑没关系吧? 另外上文指的检查快键键具体是对应哪块代码呢。
今天尝试 linux 镜像V1.1.1,4月23日发布的版本,发现用库里main分支代码编译推进去的文档会起不来

1.再和您确认一下,请问键盘是连在rubikpi设备上的吗?请您检查一下连接?
2.请问是整编整烧吗

1.再和您确认一下,请问键盘是连在rubikpi设备上的吗?请您检查一下连接?
—是接在Rubikpi设备上,连接正常,键盘敲击都OK的,不然也不会有事件出来了
2.请问是整编整烧吗
—使用的是参考使用说明书里指令:./rubikpi_build.sh -a ,然后推送dtb.bin,efi.bin 以及添加的sensor .ko文档

1.我们这边多次测试都是可用的,请您再试试
2.稍后github上会有更新