問題タブ [android-mediaprojection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Android API MediaProjection を使用してバックグラウンド サービスから画面を定期的に記録する方法は?
こんにちは、私は Android で弱い AI (ボット) アプリを構築していますが、これにはかなり慣れていません。
コンテキスト: アプリは、ボットを開始/停止し、ボットの設定を変更するための UI、一定の間隔 (たとえば 5 秒ごと) でスクリーンショットを取得する画面キャプチャ サービス、画像認識モジュール (OpenCv)、およびタッチシミュレーションサービス(Instrumentationクラス、MotionEventクラス)。明らかに、UI とは別に、ボットが起動されると、すべてのモジュールをバックグラウンドで実行できるようにする必要があります。
質問: バックグラウンドから一定の間隔で画面をキャプチャできるサービスを作成する最も効率的で合理的な方法は何ですか?
MediaProjection API のドキュメントとデモを探した後、MediaProjection を使用して画面を記録し、Timer + スケジュールされた TimerTask を使用してビットマップを保存する IntentService の作成を開始しましたが、少し迷っています。これが私がこれまでに持っているものです:
削除されました
私はそれを間違っていると感じています。説明、アドバイス、スニペット、チュートリアル、または役立つものを使用して、これを行う方法を理解するのを手伝ってもらえますか?
編集:実際、ランタイムを使用してadbシェルコマンドを実行する方がはるかに簡単です。 さらに、これにより、コンピューター上でより高速な画像処理を行うことができます
android - Android MediaProjection はオブジェクトを記録できますか (アクティビティのみ)?
lollipop 版から MediaProjection API がリリースされ、スクリーンショットの撮影や画面の録画がより簡単になりました。
しかし、私がしたい画面を記録したいと思います。画面全体ではなく、「オブジェクトの記録」に似ています。たとえば、ユーザーが通知バーをプルダウンするなどのアクションを実行したり、画面にプッシュ通知メッセージがポップアップ表示されたりした場合、それらのケースを記録から除外したいと考えています。
私が望むものをサポートする他の API はありますか? または単に MediaProjection API にはこの種の機能が既にありますか?
android - エミュレータ用の MediaProjection API を使用してキャプチャすると、黒い画面が生成されます
MediaProjection API と ImageReader を使用してエミュレータ画面をキャプチャしようとしています。ただし、常に黒い画面が生成されます。コードは次のとおりです。
MediaProjectionとAndroid を使用してスクリーンショットを撮る ImageReader.acquireLatestImage は無効な JPG を返します\ reader-acquirelatestimage-returns-invalid-jpg は既に参照しましたが、実際のデバイスでは正常に機能しますが、エミュレーターでは機能しません。
エミュレータでスクリーン キャプチャを取得するにはどうすればよいですか? 私の実装に問題がありますか?あなたはなにか考えはありますか?
すべての助けに感謝します!
android - Android の Image.getPlanes() は重すぎます
皆さん、
MediaProjection API を使用して、Android で画面キャプチャ アプリケーションを開発しています。
私はそれを実現するために ImageReader を使用していますが、 Image.getPlanes() は重すぎてリアルタイムの画面をキャプチャできません。
Image.getPlanes() がメイン スレッドをブロックするため、フレームを失いすぎてスムーズにレンダリングされた画面が表示されませんでした。コメントアウトすると、ImageReader は以前より多くの画像を取得します。
Image.close() が呼び出された後に onImageAvailable が呼び出されるため、バックグラウンドで Image.getPlanes() を実行できません。
だから、私の質問は次のとおりです。
- Image.getPlanes() が重いのはなぜですか?
- スムーズな画面キャプチャを実現する方法はありますか?
コードは次のとおりです。
助けてくれてありがとう!
質問が更新されました
android - Android のスクリーンショットから FLAG_SECURE ウィンドウを非表示にする
FLAG_SECURE フラグを持つフローティング ウィンドウがあります。スクリーンキャプチャと私が設定した MediaProjection から正常に隠されています。MediaProjection を介して記録すると、黒い長方形のオブジェクトとして表示されます。フローティング ウィンドウのすべてがブラック アウトされます。
私の質問は、このフローティング ウィンドウを非表示にすることは可能ですか? 黒いオブジェクトとして表示するのではなく、フローティング ウィンドウの下にあるコンテンツをキャプチャして、MediaProjection から完全に隠すことを意味しますか?
android - MediaProjection API の出力をネットワーク経由で送信する
私は MediaProjection API を読んでいて、その使用方法を示す Github のいくつかのサンプル プロジェクトをチェックアウトしました。
これらのプロジェクトはすべて、スクリーン キャプチャをファイルに保存する方法 (record the screen) のみを示しており、別のデバイスにリアルタイムで送信する方法 ( screencast ) については何も示していません。
このAPIを介してこれが可能かどうかはわかりませんでしたが、ドキュメントを読みました:
画面のキャプチャと共有
Android 5.0 では、新しい android.media.projection API を使用して、画面キャプチャと画面共有機能をアプリに追加できます。この機能は、ビデオ会議アプリで画面共有を有効にする場合などに便利です。
新しいcreateVirtualDisplay()メソッドを使用すると、アプリでメイン画面 (既定の表示) のコンテンツを Surface オブジェクトにキャプチャして、アプリがネットワーク経由で送信できるようになります。API では、安全でない画面コンテンツのみをキャプチャでき、システム オーディオはキャプチャできません。スクリーン キャプチャを開始するには、まず createScreenCaptureIntent() メソッドで取得した Intent を使用してスクリーン キャプチャ ダイアログを起動し、ユーザーの許可をアプリで要求する必要があります。
新しい API の使用方法の例については、サンプル プロジェクトの MediaProjectionDemo クラスを参照してください。
Surface オブジェクトを使用してデータを送信し、別のデバイスで受信して表示する方法のサンプルを一日中検索しましたが、うまくいきませんでした。
問題は、どうすればそれができるかということです。誰かが私を正しい方向に向けることができますか?
android - MediaProjection で安全なビューを完全に非表示にする - Android
MediaProjection API を使用してスクリーン レコーダー アプリを作成しています。私のアプリでは、停止ボタンを小さなオーバーレイ ウィンドウとして表示しています。このビューは、最終的に記録されたビデオに表示されないように安全に保管しています。
このビューは最終的なビデオには表示されませんが、最終的な出力自体は元のビューの代わりに黒い領域になります。
この黒い領域なしで最終的なビデオ出力を得る方法はありますか?
android - Android : 新しいアクティビティを作成せずに画面キャプチャを開始する
MediaProjection を使用して画面ビデオを録画しようとしています。同じアクティビティでビデオをキャプチャし、別のアクティビティを開始したくありません。
私はいくつかのチュートリアルを経験しました。これらのチュートリアルでは、最初の引数として startActivityForResult への呼び出しが行われcreateScreenCaptureIntent()
ます。これは基本的にパーミッションを要求し、スクリーン キャプチャを開始します。そして、resultCode
に渡されますgetMediaProjection()
メインのアクティビティをキャプチャする必要があるため、新しいアクティビティではなく、フレームを置き換えるだけです。メインアクティビティにフローティングボタンがあり、録音を停止します。
それで、それが可能かどうか知りたかったのですか?または、もちろん新しいアクティビティを作成せずに、同じイベントにつながる同様のシナリオを作成できるとしたら? または、これが不可能な場合、現在新しいアクティビティに入っていることを考えると、どうすれば記録を停止できますか?
お時間をいただきありがとうございます。
java - アンドロイド画面をストリーミング
MediaProjectionを使用してデバイス画面を記録するために、Truiton ScreenCaptureの例をフォローしようとしています。
録音ローカルを保存すると機能します
FileDescriptor で動作するように変更すると、そうではありません
LocalServerSocket を使用していない場合は、mMediaRecorder.prepare()
例外をスローします。使用しているので、以下のメソッドで例外を取得しますmMediaRecorder.getSurface()
例外
これは私のJavaサーバーです。呼び出された後にソケットを取得し、eccpectedのmMediaRecorder.prepare()
ままスタックしました。inputStream.read
私が呼び出すと、Androidの例外が発生しますmMediaRecorder.start()