6

重複する警告: この問題は、サービスとフロントエンドの両方で発生します。同様のスレッドがいくつかありますが、GUI アプローチに焦点を当てています。

問題

状態が何であれ(バックグラウンドで音楽が再生されている、画面がオンになっている(原文のまま!)、画面がオフになっている、電話がロックされている、電話がロック解除されているなど)から始めて、状態の1つのことだけを変更したいと思います-画面をオンにします. 他に何も変更する必要はありません。

試み

既知の状態から開始するには、電話をロックして画面をオフにします。

DevicePolicyManager dpm = (DevicePolicyManager)context
                .getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.lockNow();

したがって、これ以降、画面をオンにすることは、実際にキーガードを表示することを意味します。私はこれをやろうとします:

  • 強制userActivity-- 何も起こりません
  • ウェイクロックのさまざまな組み合わせ-ウェイクが弱すぎる(PARTIAL_WAKE_LOCK何も起こらないなど)か、画面をオンにしますが、ロックを保持している限り。離すと、画面はオフの状態に戻ります(ON_AFTER_RELEASE設定したにもかかわらず)。マイナーな問題は、ウェイクロックを取得する必要があるlockNowことlockNowです。

回避策

これは、 Anton CherkashynによるAndroid の画面の明るさのシステム設定を変更するからほとんどコピー & ペーストしたものです。

画面をトリガーする偽のアクティビティを追加する必要があります。

public class DummyBrightnessActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);            
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        
        //this next line is very important, you need to finish your activity with slight delay
        new Handler().postDelayed(new Runnable() { 
             public void run() { 
                 DummyBrightnessActivity.this.finish();
                 } },0);
    }

}

次に、このアクティビティを起動する必要があります (私の場合、通常は非アクティビティであるため、バックグラウンドのオプションです)。

new Handler().postDelayed(new Runnable() { 
    public void run() { 
        Intent intent = new Intent(context, DummyBrightnessActivity.class);
        intent.addFlags(Intent.FLAG_FROM_BACKGROUND | Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intent);
        } },500);

そして、マニフェストでこの偽のアクティビティについてアプリに通知する必要があります。

<activity android:name=".DummyBrightnessActivity"
          android:excludeFromRecents="true"
          android:theme="@android:style/Theme.Translucent.NoTitleBar"
          android:taskAffinity="com.antonc.phone_schedule.Dummy">
</activity>

(上記 -- アプリのメイン名前空間に配置されます)。

問題は、それが長く、信頼性が低いことです-最初の遅延(アクティビティ内)は0で非常にうまく機能しますが、2番目の...別の話、私がいくつかのロギングを行ったときは「350」で十分でしたが、一度ロギングをやめました(したがって、実行は少し速くなりました)値を増やす必要がありました。

したがって、「screenOn」機能があるという事実に直面しますが、一部のユーザーはより高速な電話を購入するため、機能しません;-)

とにかく、まだ良いものを探しています...

4

1 に答える 1

0

次のサンプルが役立つことを願っています。ウェイクロックを解放することを忘れないでください。

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wakelock_event_name");

wl.acquire();
 // Your Code
wl.release()

// when -これが発生した時刻 SystemClock.uptimeMillis();も使用できます。pm.userActivity(の場合、真/偽)

于 2015-04-01T16:15:34.313 に答える