我试图以编程方式截取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()
行。
答案 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" />
权限。