Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

これでBluetoothキーボードは不要!?AndroidにRealforceを!

タイトルは釣りです。

Androidのソフトウェアキーボードで文字を打つのは辛いものです。
電車の中ならともかく、ログイン画面のデバッグするたびにメールアドレス打つのは、気が狂いそうになります。

しかし卓上で使うためにBluetoothキーボードを買うのはエコでは無いので、PCのRealForceを活用してあげましょう。

キーボードはこまめに掃除しましょう。

当然ADBは入っているはずなので、

[bash]
$ adb shell input text test@example.com
$ adb -s HT1234567890 shell input text test@example.com
[/bash]

とやればOKです。デバイスが2個以上接続されているときは、2個目のようにシリアルNoを指定してあげましょう。

しかし、毎回adb shell input textと打つのは疲れます。
そこで、シェルを使いこなしてスマートに解決!せずに、無駄にGUIアプリでも作ってみましょう。

文字を入力してEnterするとAndroidに入力されます

executeしているだけなのでえらく簡単です。
パスワードをマスクしたり↑キーで履歴を辿ったりする程度の気遣いがあれば、多少は実用的ですね。

[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;

namespace AdbInputer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
updateDeviceList();
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
doAdbInput(textBox1.Text);
textBox1.Text = "";
}
}

private void doAdbInput(string text)
{
string command = "adb";
Device selected = deviceList.SelectedItem as Device;
if (selected != null)
{
command += " -s " + selected.serial;
}

command += " shell input text \"" + text + "\"";
doCommand(command);
LogBox.Text += text + "\n";
}

private string doCommand(string command)
{
try
{
ProcessStartInfo psi = new ProcessStartInfo();

psi.FileName = "cmd.exe";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.Arguments = @"/c " + command;

Process p = Process.Start(psi);
return p.StandardOutput.ReadToEnd();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return null;
}

private void updateDeviceList()
{
deviceList.Items.Clear();
foreach (Device d in getDeviceList())
{
deviceList.Items.Add(d);
}
}

private Device[] getDeviceList()
{
List devices = new List();
try
{
string res = doCommand("adb devices");
StringReader reader = new StringReader(res);
string line;
while ((line = reader.ReadLine()) != null)
{
string[] strs = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (strs.Length == 2)
{
devices.Add(new Device { serial = strs[0], type = strs[1] });
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return devices.ToArray();
}

private class Device
{
public string serial { get; set; }
public string type { get; set; }
public override string ToString()
{
if (serial == null || type == null)
{
return "(not available)";
}
return "[" + type + "] " + serial;
}
}
}
}
[/csharp]

textBox1とかForm1とかにやる気のなさが滲み出ています。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。