Получение ориентации устройства Android с помощью ddmlib.jar

#android #screenshot

#Android #снимок экрана

Вопрос:

Я разрабатываю программу, которая позволяет пользователю отображать на экране своего компьютера текущий экран своего телефона Android (подключенного к компьютеру через USB) с помощью библиотеки ddmlib. Мне нужно знать, находится ли телефон в альбомном или портретном режиме.

Есть ли способ проверить это значение из программы, запущенной на компьютере?

Ответ №1:

Вот моя функция для получения этого, но она довольно медленная. На данный момент я ищу более быстрое решение.

 private int getLandscape() {
        int result = 0;
        try {
            String[] commands = new String[] { "adb", "-s", actualSerial,
                    "shell", "dumpsys input | grep 'SurfaceOrientation'" };
            Runtime rt = Runtime.getRuntime();
            Process pr;
            pr = rt.exec(commands);
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    pr.getInputStream()));
            String line = "";
            line = input.readLine();
            if (line != null) {
                String[] lines = line.split(":");
                result = Integer.parseInt(lines[1].trim());
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return resu<
    }
  

Самая медленная часть — чтение из BufferedReader.

Ответ №2:

 class AReceiver implements IShellOutputReceiver {
    int x;
    int y;
    @Override
    public void addOutput(byte[] arg0, int arg1, int arg2) {
        String xS = new String(arg0);
        xS = xS.substring(26).trim();
        String[] screenRes = xS.split("x");
        x = Integer.parseInt(screenRes[0]);
        y = Integer.parseInt(screenRes[1]);
    }

    @Override
    public void flush() {

    }

    @Override
    public boolean isCancelled() {
        return false;
    }       
}
AReceiver receiver = new AReceiver();
try {
    dev.executeShellCommand("dumpsys window | grep "mOverscanScreen"", receiver);
    res[0] = receiver.x;
    res[1] = receiver.y;
} catch (TimeoutException | AdbCommandRejectedException | ShellCommandUnresponsiveException | IOException e) {
        e.printStackTrace();
}
  

Решение Ffast с использованием executeShellCommand . На моем компьютере предыдущее решение занимает около 400ms времени, чтобы получить ответ, и это решение становится ландшафтным примерно 50ms 🙂 Удачи с вашим приложением!