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]
"использование:% 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();
}