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