質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2630閲覧

Androidアプリによるリアルタイムで画面キャプチャを行う

mN6gZkd8fr

総合スコア14

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/12/21 17:11

編集2016/12/21 17:13

以前、Android端末の画面キャプチャ方法を質問し、あれこれやっていくうちに描画されたボタンをタップするとスクショを撮るという処理をサービスで行うアプリケーションを作成しました(ボタンを最前面に描画させるため)。
(参考にしたサイト:http://techbooster.org/android/application/17026/)

上記URLのサイト通りにコードを記述し動作確認しました。実行中何度ボタンをタップしてもスクショを撮ることができることも確認しました。
本来の目的は画面の指定した座標の色の変化を検出することなので、私は手動で撮る処理から自動で連写するような処理に変更しました。行ったことは、回数を指定しスクショを撮る部分をfor文で回そうとしたのです。しかし、ループの2回目で撮る際にimageがnullになるためエラーで強制終了するようになりました。(acquireLatestImage()メソッドでnullを返しているみたいです)

サービスがActivityと同じスレッドで動くはずなので、for文でまわすとimagereaderが更新されずqueueが空のままなのだと考え、スクショを撮る処理を別スレッドで行うようにしました。そうすると連写することができました。

しかし、別スレッドにしたからといってqueueが常時空ではないという訳ではなく、たまにnullになってしまいます。そのときは仕方なくdo-whileでqueueに何かが入るまで待機させてます。そのため、連写する速さは一定ではありません。imagereaderの更新する時間がないのかと思い、適当にsleepさせて時間を稼いでも一定ではありません。

そこで、今回質問する内容は、
・imagereaderが持つqueueはどのタイミングで要素が追加されるのか
・連写の速さを一定に保つことは可能であるか
です。日本語が下手であるのと長文ですみません。回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードが無いので推測になります。
画面の更新がない場合はacquireLatestImageはnullを返すようです。
そのため、nullが返ってきたら以前使ったImageを使うようにすればいいのではないでしょうか。
また、for文とsleepを組み合わせることで限りなく一定間隔にはなっていると思いますよ。

投稿2016/12/22 00:58

編集2016/12/22 00:58
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mN6gZkd8fr

2016/12/22 15:58 編集

回答ありがとうございます。 助言通り、nullが返ってきたら以前のImageを使うように変更すると各撮影にかかる時間が10ms高速化することができました。 しかし、やはり一定の速さで処理されません。計測してみたところ、質問中のURLに掲載されているコードの Bitmap bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.RGB_565); bitmap.copyPixelsFromBuffer(buffer); の部分で時間の誤差が生まれているようです。最悪13msの誤差があるときもあります。なぜ同じ処理で同じ事をしているのに処理の時間に誤差が生まれてしまうのでしょうか?
yona

2016/12/23 00:48

Android端末のCPUやメモリの使用状況が異なるからですよ。 PCでも適当なファイルを開いたりするときの速さは一定では無いですよね?
mN6gZkd8fr

2016/12/23 01:28

言われてみればそうでした… 初歩的なことを質問してすみません これ以上速さを求める必要がないように思えたので、これで満足しようと思います。ありがとうございました。
yona

2016/12/23 01:29

間隔を15ms程度に抑えると一定間隔になりそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問