【问题标题】:Android: write failed: EPIPE (Broken pipe) Error on write fileAndroid:写入失败:EPIPE(断管)写入文件时出错
【发布时间】:2013-07-12 12:54:58
【问题描述】:

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

【问题讨论】:

  • 你的设备有root权限吗?
  • @Alex- 我只是在模拟器上运行它。在其中一篇文章中,我发现,我不必拥有 root 权限。可能是错的。请你帮我如何在模拟器上获得root权限?
  • 您正在尝试使用来自 /system/bin 的系统命令。我假设您需要 root 权限才能在模拟器上调用它。不过你可以试试这个截图方法:stackoverflow.com/questions/2661536/…

标签: android file outputstream android-permissions epipe


【解决方案1】:

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更详细的解释。

【讨论】:

  • 感谢您的回复。请你能告诉我如何在代码中使用这个apk吗?我在 os.write 上得到错误。
  • @HariprasauthRamamoorthy 查看我的编辑。我建议更清晰的方式
  • 再次感谢您。我只是想从命令提示符执行这些命令,它似乎只是挂起。你以前试过这些吗?执行一行会不会花很多时间?
  • @HariprasauthRamamoorthy 这很奇怪。当然我试过了,一次都没有。一切都很好。尝试重启 adb。
  • 现在它可以工作了。我现在已经安装了超级用户 - su 。我应该按照相同的链接吗?
【解决方案2】:

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

您必须添加&lt;uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" /&gt; 权限。

也请查看:Permission denial: Can't access the SurfaceFlinger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2012-09-02
    • 2011-05-11
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多