19

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

4

2 回答 2

10

EPIPE 问题通常发生在您尝试getRuntime().exec在没有它的设备上执行需要 root 权限 ( ) 的命令或同时运行多个 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更详细的解释。

于 2013-07-12T13:04:34.323 回答
0

问题是您的应用程序没有系统权限来访问表面抛掷器(它使用屏幕缓冲区和硬件解码器来呈现您的视频文件)。为了获得这些权限,您必须将您的应用程序构建(并签名)为系统应用程序,并将其定位在 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

于 2015-06-28T12:46:18.650 回答