Android shell命令有奇怪的行为("输入tap x y")

时间:2015-08-31 14:32:50

标签: android shell input touch emulation

对不起可能是愚蠢的问题,但我花了差不多两天的时间试图解决问题。

我有这个示例代码,我通过调用shell命令来模拟屏幕触摸"输入tap 807 730"。它有效。

public class DisableRequest extends Thread {
    @Override
    public void run() {
        super.run();
        StringBuffer output = new StringBuffer();

        try {
            Thread.sleep(3000);

            Process p = Runtime.getRuntime().exec("input tap 807 730");
            p.waitFor();

            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = "";

            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
        } catch (Exception e) {
            Log.v("INPUT_TEST", "Error : " + e.toString());
        }

        String response = output.toString();
        Log.v("INPUT_TEST", "Response : " + response);

    }

}

我有两个案例。

1)我在onCreate()中调用此代码。在这种情况下,所有工作都很棒对于测试我在屏幕上有一个大按钮,我可以看到命令后如何点击这个按钮。

2)我也在onCreate()中调用了这段代码,但之后我调用此代码打开对话框以请求设备管理员。

private void askForAdministrator() {
    //Begin enabling device administrator
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    ComponentName deviceAdminComponentName = new ComponentName(this, MyAdminReceiver.class);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminComponentName);
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "You must enable device administration for certain features"
            + " of the app to function.");

    //I thought that this would start the activity that lets the user
    //choose whether to enable the app as a device admin
    startActivityForResult(intent, ACTIVATION_REQUEST);
}

以下是接下来发生的事情:

1)对话框,它有两个按钮,打开。我知道数字801和730是按钮的坐标"激活"。我从启用"显示指针位置"获得了这些数字。 in"开发者选项"当我点击"激活" “设备管理员”对话框的按钮。

2)延迟(2秒)后我可以在logcat中看到我的线程确实有效。

3)按钮"激活"没有任何接触/点击。为什么?

所以我的问题是为什么?

但是,如果我将像这样使用ADB调用输入命令

./adb shell input tap 807 730

然后"激活"按钮会得到帮助。那么为什么我从线程中获得的命令不起作用。

1 个答案:

答案 0 :(得分:1)

您可以在应用内访问的shell是沙盒。出于明显的安全原因,您无法将输入事件发送到系统对话框。您可以通过以超级用户身份执行命令在root设备上绕过此功能。