Ошибка обрыва трубы при захвате изображения в 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 для доступа в том месте, где вы хотите сохранить изображение.