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)

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


EDIT:

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

Ответы

Ответ 1

Проблема 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 более подробное объяснение.

Ответ 2

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