2009年6月22日月曜日

Android Music App on Beagle Board (2)

MusicやContactアプリ等を起動するとacoreがエラーとなる。これはtouchscreenがない場合のres/layoutが存在しないため。
res/layout-finger以下のリソースをres/layout-notouchにコピーすることで回避は可能だが,uinputの使い方を調べるついでにダミーのtouchscreenデバイスを作ってやることで回避してみる。以下のようなコードを実行することで/dev/inputの下にダミーのtouchscreenデバイスが作成される。この状態でchrootでandroidを起動してやればMusic,Contactは普通に使用できるようになる。

#define UINPUT_DEV "/dev/input/uinput"
#define DEV_NAME "Dummy Touch Screen"

static int uinput_fd = 0;

void uinput_touch_init(const char* uinput_dev, const char* dev_name) {
struct uinput_user_dev dev;

uinput_fd = open(uinput_dev, O_WRONLY);
if (uinput_fd <= 0) {
perror("Error opening uinput device.\n");
return;
}
memset(&dev, 0, sizeof(dev));
strcpy(dev.name, dev_name);
write(uinput_fd, &dev, sizeof(dev));

/* touch screen event */
ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);
ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);

/* register */
ioctl(uinput_fd, UI_DEV_CREATE, 0);
}

int main(int argc, char* argv[]) {
uinput_touch_init(UINPUT_DEV, DEV_NAME);
while(1) {
sleep(60);
}
}

参考:
http://groups.google.co.jp/group/android-porting/browse_thread/thread/f13cb06a4bff0b9
Instead of hacking up the default Google apps, I just added a trivial
fake touchscreen driver using uinput, it only has to register an abs
event uinput device to made Android happy. We use it on our non-
touchscreen Android ports since those apps are easily navigated using
keyboard and trackpad/mouse.
-Matt

0 件のコメント: