Android:写入失败:EPIPE(Broken pipe)写入文件出错

时间:2013-07-12 12:54:59

标签: android file outputstream android-permissions epipe

我试图以编程方式截取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()行。

2 个答案:

答案 0 :(得分:10)

EPIPE问题通常发生在您尝试在没有它的设备上执行需要root权限(getRuntime().exec)的命令或同时运行多个root命令时。如果你在模拟器上工作并需要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有更详细的说明。

答案 1 :(得分:0)

问题是你的应用程序没有系统权限来访问表面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" />权限。

请同时查看此内容:Permission denial: Can't access the SurfaceFlinger