5

ユーザーが携帯電話を振るたびにスクリーン キャプチャ ユーティリティ ()を実行するsuプロセスを Android で実行しています。/system/bin/screencap

ユーザーが電話を振って別のスクリーンキャップを取得できるようにする前に、各スクリーンキャップが終了するのを待ちたいと思います。ただし、プロセスprocess.waitFor()を閉じてスクリーンキャップごとに再度開きたくないため、使用は機能しませんsu(スーパーユーザーアプリのトーストが表示され、スクリーンキャップに干渉するため)

これまでのところ、私は持っています:

サービス中onCreate():

p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();

シェイクリスナーハンドラーで:

if (isReady) {
  isReady = false;
  String cmd = "/system/bin/screencap -p " + nextScreenshotFullPath + "\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();

  [INSERT MAGIC HERE]
  isReady = true;

  Bitmap bm = BitmapFactory.decodeFile(nextScreenshotFullPath);
  // Do something with bm
}

[INSERT MAGIC HERE] は私が探しているものです -screencap終了するまで待機するコードです。

4

2 に答える 2

3

私は方法を発見しました!0シェルコマンドを使用してecho -n 0(改行を防ぐために) 1文字(たとえば、)をエコーし​​、-nそれを読み返します。シェルはscreencapコマンドが終了するまで文字を出力せず、InputStream#read()メソッドはその文字を読み取ることができるまでブロックします...またはコードで話す:

サービスの onCreate():

p = Runtime.getRuntime().exec("su");
os = p.getOutputStream();
is = p.getInputStream(); // ADDED THIS LINE //

シェイクリスナーハンドラーで:

if (isReady) {
  isReady = false;
  String cmd = "/system/bin/screencap -p " + nextScreenshotFullPath + "\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();

  // ADDED LINES BELOW //
  cmd = "echo -n 0\n";
  os.write(cmd.getBytes("ASCII"));
  os.flush();
  is.read();
  // ADDED LINES ABOVE //

  isReady = true;

  Bitmap bm = BitmapFactory.decodeFile(nextScreenshotFullPath);
  // Do something with bm
}
于 2013-04-23T04:10:08.120 に答える
0

ファイルサイズが一定になるまでループしないのはなぜですか? あなたはすでにコマンドラインプロセスをフォークしています:)

スクリーン キャプチャだけが必要な場合は、プログラムで行うことができます。

//Get a screenshot of the screen
private Bitmap getScreenShot()
{
    View v = findViewById(R.id.your_top_level_layout_or_view);

    //Save the bitmap
    v.setDrawingCacheEnabled(true);
    Bitmap screenShot = v.getDrawingCache();
    Bitmap nonRecyclableScreenShot = screenShot.copy(screenShot.getConfig(), false);

    //Restore everything we changed to get the screenshot
    v.setDrawingCacheEnabled(false);

    return nonRecyclableScreenShot;
}
于 2013-04-16T23:14:33.230 に答える