ScreenCap напрямую toByteArray, пропуская сохранение в память

0 CodeGuru [2018-08-10 11:37:00]

Я пытаюсь оптимизировать код, приведенный ниже, можно ли напрямую использовать ScreenCap для байт-массива, чтобы я мог пропустить шаг его сохранения в память.

Process sh = Runtime.getRuntime().exec("su", null,null);
OutputStream os = sh.getOutputStream();
os.write(("/system/bin/screencap -p " + "/sdcard/colorPickerTemp.png").getBytes("ASCII"));
os.flush();
os.close();
sh.waitFor();

InputStream inputStream = new FileInputStream("/sdcard/colorPickerTemp.png");//You can get an inputStream using any IO API
byte[] bytes;
byte[] buffer = new byte[1000000];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
    } catch (IOException e) {
        e.printStackTrace();
    }
bytes = output.toByteArray();
final String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);

java android arrays inputstream outputstream


1 ответ


2 Peter Samokhin [2018-08-10 11:48:00]

Использование Screencap:

"использование:% s [-hp] [-d display-id] [FILENAME]\n"
"-h: это сообщение \n"
"-p: сохранить файл как png.\N"
"-d: указать идентификатор отображения для записи, по умолчанию% d.\N"
"Если FILENAME заканчивается на.png, он будет сохранен как png.\N"
"Если FILENAME не указан, результаты будут напечатаны на стандартный вывод. \N"

Таким образом, вы можете сделать что-то вроде этого:

public String getScreenshotBase64() throws IOException {
    return Base64.encodeToString(getScreenshotImageBytes(), Base64.NO_WRAP);
}

public byte[] getScreenshotImageBytes() throws IOException {
    Process process = Runtime.getRuntime().exec("su");
    OutputStreamWriter outputStream = new OutputStreamWriter(process.getOutputStream());
    outputStream.write("/system/bin/screencap -p\n");
    outputStream.flush();
    byte[] bytes = readBytes(process.getInputStream());
    outputStream.write("exit\n");
    outputStream.flush();
    outputStream.close();

    return bytes;
}

public byte[] readBytes(InputStream inputStream) throws IOException {
  ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

  int bufferSize = 1024;
  byte[] buffer = new byte[bufferSize];

  int len = 0;
  while ((len = inputStream.read(buffer)) != -1) {
    byteBuffer.write(buffer, 0, len);
  }

  return byteBuffer.toByteArray();
}