web-dev-qa-db-ja.com

Android:書き込み失敗: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()の行で発生することに注意してください。

EPIPEの問題は、通常、ルート権限が必要なコマンド(getRuntime().exec)を実行せずにデバイス上で実行しようとした場合、または複数のルートコマンドを同時に実行した場合に発生します。エミュレータで作業し、それをルート化する必要がある場合、エミュレータの実行中にこれを試すことができると思います。

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 詳細な説明。

10

問題は、アプリにサーフェスフリンガー(スクリーンバッファーとハードウェアデコーダーを使用してビデオファイルをレンダリングする)にアクセスするためのシステム権限がないことです。これらの権限を取得するには、アプリをシステムアプリとしてビルド(および署名)し、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にアクセスできません

0
benchuk