Android: запись не удалась: EPIPE (Broken pipe) Ошибка при записи файла

Я попытался сделать скриншот экрана Android программно. Я сделал следующий код:

private void getsnap(){ try{ Process sh = Runtime.getRuntime().exec("su", null, null); OutputStream os = sh.getOutputStream(); String filePath = this.getFilesDir().getPath().toString() + "/fileName1.jpeg"; os.write(("/system/bin/screencap -p " + filePath).getBytes("ASCII")); os.flush(); os.close(); sh.waitFor(); } catch (Exception e) { e.printStackTrace(); } } 

java.io.IOException: write failed: EPIPE (Broken pipe)

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


РЕДАКТИРОВАТЬ:

Обратите внимание, что ошибка происходит в строке os.write() .

Solutions Collecting From Web of "Android: запись не удалась: EPIPE (Broken pipe) Ошибка при записи файла"

Проблема EPIPE обычно возникает, когда вы либо пытаетесь выполнить команду, которая требует корневых разрешений ( getRuntime().exec ) в вашем случае на устройстве без нее или одновременно запускает несколько корневых команд. Если вы работаете над эмулятором и вам нужно его root, я думаю, вы можете попробовать это, пока эмулятор работает:

 adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system adb push su /system/xbin/su adb shell chmod 06755 /system adb shell chmod 06755 /system/xbin/su 

Здесь http://abd-tech.blogspot.com/2011/05/test-root-apps-on-android-emulator.html более подробное объяснение.

Проблема в том, что ваше приложение не имеет системных разрешений для доступа к поверхностному flinger (который использует экранный буфер и hw-декодер для рендеринга вашего видеофайла). Чтобы иметь эти разрешения, вам нужно создать (и подписать) ваше приложение как системное приложение и найти его в папке system / priv-app. Кроме того, для этого системного приложения необходимо добавить следующие разрешения:

 <manifest package="com.yourapp.demo" android:versionCode="1" coreApp="true" android:sharedUserId="android.uid.media" android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android"> 

Обратите внимание на части coreApp="true" android:sharedUserId="android.uid.media" .

И вам нужно будет добавить <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" /> .

Пожалуйста, проверьте это также: Разрешение отказа: не удается получить доступ к SurfaceFlinger