9

Android デバイスのカメラから数時間にわたって定期的に写真を撮り、タイム ラプス ビデオ効果を作成したいと考えています。

数分ごとにサービスを開始するように AlarmManager.RTC_WAKEUP フラグを設定して、Alarm Manager を設定しました。

このサービスは、部分的なウェイクロックを保持し、いくつかの作業を行った後、アクティビティを開始するアラーム マネージャーを介してブロードキャスト レシーバーを呼び出します。

アクティビティが作成 (または再開) され、独自のウェイクロックがオンになり、カメラ プレビュー サーフェスが設定されます。サーフェスがセットアップされると、SurfaceHolder リスナーの surfaceChanged() メソッドが呼び出され、最終的に写真が撮影されます。

デバイスが起動している場合、すべてが期待どおりに完全に機能します。ただし、デバイスがスリープ状態の場合、Activity の onResume() メソッドが完了すると、Activity は即座に一時停止します。カメラのプレビュー サーフェイスの初期化が完了することはなく、写真が撮影されることもありません。

だから私が持っている質問は次のとおりです。

  1. プログラムで電話をウェイクアップする方法はありますか? 私も使ってみます:

    PowerManager powerManager =
                (PowerManager)this.getSystemService(Context.POWER_SERVICE);
    powerManager.userActivity(SystemClock.currentThreadTimeMillis(),false);
    

ただし、電話がスリープ状態の場合、それは電話を目覚めさせません。

  1. プレビュー サーフェス ビューを使用せずに写真を撮る方法はありますか?

  2. 非同期コールバックに依存しない写真を撮る方法はありますか? 写真を撮るためにすべてのコードをアクティビティの onResume() メソッドに入れることはできますか?

  3. カメラのプレビューがすべてのリスナーを初期化して呼び出すのに十分な時間を確保できるように、アクティビティの onResume() メソッドを十分長く実行し続ける方法はありますか?

ウェイクロックを正しく使用しており、マニフェスト ファイルですべての権限を適切に設定しています。非同期リスナーが適切に機能するのに十分な時間、アクティビティが起動していません。

さらに問題を複雑にしているのは、すべての Android 1.6 との互換性を維持しようとしていることです。これは、私がアクセスできる唯一のテスト デバイスだからです。

これはイライラするものです!

4

3 に答える 3

8

今ようやくどこかへたどり着きました。

これらの 2 つのフラグを使用してウェイクロックを作成する必要があります

PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "bbbb");
wl.acquire();

次に、デバイスがウェイクアップし、キーガード画面から開始します。

しかし、キーガード画面を通過して写真を撮る唯一の方法は、アクティビティのウィンドウでこれらのフラグを使用することです。

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

ただし、これは Android 2.0 でのみ利用可能で、1.6 では機能しません。

于 2011-03-07T19:23:37.407 に答える
2

キーガード画面を無効にすることもできます

KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
km.newKeyguardLock(TAG).disableKeyguard();

DISABLE_KEYGUARD 権限を持っている場合。

これは API レベル 1 以降で利用できます。

于 2011-03-29T16:43:09.447 に答える
0

onResume メソッドでこのようなことをしていますか

.... onResume() {
    ....
    WakeLock myWakeLock = .....;
    ...
}

その場合、メソッドが終了するとすぐに WakeLock が解放され、デバイスは好きなことを自由に実行できるようになり (スリープ状態に戻る可能性が高い)、クラスのどこかに WakeLock を保存する必要があります。関数ローカルとしてではありません。

于 2011-03-07T03:05:44.800 に答える