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