Android: write failed: EPIPE (Broken pipe) Error o

2019-01-18 03:59发布

I was trying to take screenshot of the Android screen programatically. I had done the following code:

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)

Please can someone help? I had already checked the other posts and I dont find anything solving my issue.


EDIT:

Please note, the Error happens in the line os.write().

2条回答
来,给爷笑一个
2楼-- · 2019-01-18 04:04

EPIPE issue usually happens when you either try to execute command which needs root permissions (getRuntime().exec) in your case on the device without it or run several root commands simultaneously. If you work on the emulator and need to root it I think you you can try this while the emulator is running:

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

Here http://abd-tech.blogspot.com/2011/05/test-root-apps-on-android-emulator.html more detail explanation.

查看更多
爷的心禁止访问
3楼-- · 2019-01-18 04:09

The problem is that your app does not have system permissions to access the surface flinger (which uses screen buffer and hw decoder to render your video file). In order to have these permissions you have to build (and sign) your app as a system app and locate it at the system/priv-app folder. In addition to that you have to add the following permission to this system 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">

note the coreApp="true" android:sharedUserId="android.uid.media" parts.

and you will have to add <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" /> permission.

please checkout this as well: Permission denial: Can't access the SurfaceFlinger

查看更多
登录 后发表回答