Intereting Posts
Эмулятор не отображается в adb-устройствах Android: Уведомить пользователя о новой версии Поддержка FFmpeg для аппаратного декодирования libstagefright Есть ли какой-нибудь шаблон в методе Random ()? Set Прозрачный фон для alertdialog в android Изменение значков TabLayout слева, сверху, справа или снизу в com.android.support:design:23.1.0 Разработка клиентских приложений REST для Android Каким должно быть имя пакета приложения для Android? Почему в моем Android ничего не отображается? Плохой оконный токен, вы не можете показать диалог перед созданием Activity или после его скрытия Android GCM отправлен успешно, но не принят на некоторых устройствах Подтвердите электронную почту внутри EditText Как правильно отображать вкладки (пробелы), поступающие из базы данных MySQL, как в Android, так и в приложении IOS? Приложения Android OpenGL перестают работать после загрузки в эмулятор Две службы с одним и тем же фильтром намерений

Ошибка обрыва трубы при захвате изображения в android

Я собираюсь захватить изображение, которое из приложения в android, но есть некоторые проблемы с Output Stream и есть ошибка с BROKEN PIPE с JAVA.IO. Мой код, если ниже. Вот проблема с функцией команды записи. Я загрузил эту демонстрацию из git-хаба, поэтому, пожалуйста, помогите мне как можно скорее. Заранее большое спасибо.

void takeScreenshot() { String file ="/data/data/com.koushikdutta.screenshot/screenshot.bmp";; OutputStream os = null; int screenshotUid; String screenshotUser = null; Process sh = null; try { try { sh = Runtime.getRuntime().exec("su -c sh"); os = sh.getOutputStream(); Log.e("","THE VALUE OF OBJECT IS:::::"+os.toString()); // file ="/data/data/com.koushikdutta.screenshot/screenshot.bmp"; screenshotUid = getUidForPackage("com.koushikdutta.screenshot"); screenshotUser = getUserForPackage("com.koushikdutta.screenshot"); } catch(Exception e) { Log.e("","Hi Error created"); } try { Thread.sleep(2000); writeCommand(os, "rm "+file); writeCommand(os, "mkdir /sdcard/dcim"); } catch(Exception e) { Log.e("","Hello How are you??"+e.getMessage()); } writeCommand(os, "mkdir /sdcard/dcim/Screenshot"); writeCommand(os, "/data/data/com.koushikdutta.screenshot/screenshot"); writeCommand(os, "chown root." + screenshotUser + " " + file); writeCommand(os, "chmod 660 " + file); writeCommand(os, "exit"); os.flush(); os.close(); boolean success = false; for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); // if we can successfully get the exit value, // then that means the process exited. sh.exitValue(); success = true; break; } catch (Exception ex) { Log.e("","Error while"+ex.getMessage()); } } try { if (!success) throw new Exception("Unable to take screenshot"); File screenshot = new File(file); if (!screenshot.exists()) throw new Exception("screenshot.raw file not found!"); mHander.post(new Runnable() { public void run() { Toast toast = Toast.makeText( ScreenshotActivity.this, "Screen captured!", Toast.LENGTH_LONG); toast.show(); } }); } catch(Exception e) { Log.e("","ERROR CREATING......."+e.getMessage()); } try { FileInputStream fs = new FileInputStream(file); mBitmap = BitmapFactory.decodeStream(fs); mScreenshotFile = String.format( "/sdcard/dcim/Screenshot/screenshot%d.png", System.currentTimeMillis()); FileOutputStream fout = new FileOutputStream(mScreenshotFile); mBitmap.compress(CompressFormat.PNG, 100, fout); fout.close(); mConnection.scanFile(mScreenshotFile, null); } catch (Exception ex) { Log.e("","Error while"+ex.getMessage()); } mHander.post(new Runnable() { public void run() { mImage.setImageBitmap(mBitmap); } }); } catch (Exception ex) { Toast toast = Toast.makeText( ScreenshotActivity.this, "Error: " + ex.getMessage(), Toast.LENGTH_LONG); toast.show(); Log.e("",""+ "Error: " + ex.getMessage()); } } static void writeCommand(final OutputStream os, String command) { try { os.write((command+"\n").getBytes("ASCII")); } catch(Exception e) { e.printStackTrace(); Log.e("","Error was::::::::::::::::::"+e.getMessage()); } } 

Solutions Collecting From Web of "Ошибка обрыва трубы при захвате изображения в android"

Я думаю, что процесс, который вы выполнили, был прерван, поэтому OutputStream больше не доступен, поэтому ошибка «Broken Pipe».

Я бы попробовал:

 ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start(); 

Вместо прямого вызова:

 sh = Runtime.getRuntime().exec("su -c sh"); 

Попробуйте. Дай мне знать.

Возможно, вы можете получить хорошие идеи:

Процесс Java с потоком ввода / вывода

На всякий случай … Вы проверили правильность вашей карты памяти? Если вы используете Wi-Fi – соединение хорошее?

Я думаю, что это проблема с доступом к хранилищу, вы должны просмотреть разрешение на использование, и, возможно, вам следует использовать Environment.getExternalStorage.getPath для доступа в том месте, где вы хотите сохранить изображение.