アプリからの画面キャプチャの方法

4,477 views
Skip to first unread message

help

unread,
Mar 2, 2011, 6:54:38 AM3/2/11
to 日本Androidの会
こんにちは。

以下についての情報をお持ちの方、ご教授いただけませんでしょうか。

ddmsから、実機もしくはEmulatorの画面のキャプチャを取得する方法

は広く知られていると思いますが、

実機にインストールされている端末のアプリから、

今現在表示されている画面のキャプチャをとる方法はありませんでしょうか?


AndroidScreenMonitor等を利用し、

PC→実機のキャプチャ画像を落とすことは出来るのですが、

実機にあるアプリからのトリガーでキャプチャ画像を取る方法が分かりません。

ご存知の方よろしくお願いします。

福井登志也

unread,
Mar 2, 2011, 7:38:14 AM3/2/11
to android-g...@googlegroups.com
help 様

 こんにちは。

 福井@ちょるちょるドットコムです。


 偶然にも同じことを私の方でも昨日から調べていました。

 今のところ、スクリーンのキャプチャを取る方法は見つかっていないのですが、
View のイメージを抜き出す方法は以下のURLで紹介されていますね。

 http://www.saturn.dti.ne.jp/~npaka/android/SnapShotEx/index.html


ですが、こちらの方法は SurfaceView やVideoView から撮ることはできません。

 しかし、以下のアプリのように 画面キャプチャを取得するアプリを作られた方もいるようです。

 http://jp.androlib.com/android.application.net-srcz-android-screenshot-zEtD.aspx


 私のほうでは、Linux 向けの一般的なスクリーンショットアプリのソースを見てみようと思ってたところでした。
おそらく、SDK に用意されてる部品では不可能ではないかと...。


 参考にならずに申し訳ありません (-_-;)


// ちょるちょるドットコム 福井登志也


2011年3月2日20:54 help <akatsuki.am@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


鷹見純

unread,
Mar 3, 2011, 9:33:08 AM3/3/11
to android-g...@googlegroups.com
help 様

画面キャプチャは,フレームバッファデバイス"/dev/graphics/fb"を使用して,ここから画像イメージをキャプチャします。
このデバイスの実態はRAM上のビデオRAMです。
このデバイスにアクセスするには,ルート権限必要です。
アプリケーションプログラムは,ルート権限を取得できないので,画面をキャプチャすることはできません。
ddmsでキャプチャを行う部分はルート権限で稼働します。


1. 実機のキャプチャ
 アプリケーションがユーザ権限をとることができませんので,フレームバッファにアクセスできません。
 したがって,アプリでのキャプチャは困難です。

2. Emulator
  adbのshellはルート権限で稼働します。
 c言語でプログラムを作成し,adbから起動するとルート権限で稼働するプロセスができます。
 これを使えば,フレームバッファにアクセスできます。

鷹見

福井登志也

unread,
Mar 3, 2011, 9:57:21 AM3/3/11
to android-g...@googlegroups.com
鷹見様

 福井です。

 私も困っていたので、非常に有益な情報をありがとうございます。

 やはり root 化されたデバイスでないと、ダメみたいですね。

 画面を構成するそれぞれの View から getDrawingCache から取得したビットマップを
組み合わせてそれっぽいものを作ることは出来たのですが、どうしても SurfaceView から 派生している VideoView のビットマップは取得できず、SurfaceView のソースコードを見て納得しているところです。

 MediaPlayer のソースには以下の通り、getFrameAt() という未実装のメソッドが用意されており、今後、これが公開されば、VideoViewのスクリーンショットも取ることができそうですが...。

(android_src)/frameworks/base/media/java/android/media/MediaPlayer.java:1180

/**
* Currently not implemented, returns null.
* @deprecated
* @hide
*/
public native Bitmap getFrameAt(int msec) throws IllegalStateException;


// ちょるちょるドットコム 福井登志也


2011年3月3日23:33 鷹見純 <taka...@gmail.com>:

--

unread,
Mar 3, 2011, 7:44:57 PM3/3/11
to 日本Androidの会
城です

> 画面キャプチャは,フレームバッファデバイス"/dev/graphics/fb"を使用して,ここから画像イメージをキャプチャします。
> このデバイスの実態はRAM上のビデオRAMです。
> このデバイスにアクセスするには,ルート権限必要です。
graphics グループでreadできます。
shell ユーザは graphics グループです。

> アプリケーションプログラムは,ルート権限を取得できないので,画面をキャプチャすることはできません。
> ddmsでキャプチャを行う部分はルート権限で稼働します。
実機では、shell ユーザです。
エミュレータ上ですと、root です。

> 1. 実機のキャプチャ
> アプリケーションがユーザ権限をとることができませんので,フレームバッファにアクセスできません。
> したがって,アプリでのキャプチャは困難です。
'Android ScreenGrab' で google検索していただくと、
root なしで実現されている方のページが見つかります。
fbを読み込むプロセスを、shell権限で実行して、
JNI経由で取得しています。
USBで繋いで、adb の shell から 起動してあげる必要があります。

パッと見めんどくさそうですが、
一連の動作をバッチ処理等でワンクリックでできるようにすれば、
一般のユーザでの敷居も下がり、いいかな。

Reply all
Reply to author
Forward
0 new messages