12

ここで、画面がオンになっているかどうかを判断しようとしていますが、電源ロック/ロック解除ボタンを押しても機能していないようです。アプリケーションはエラーなしで動作しますが、if-else のコードは効果がないようです。 コードが機能するようになりました(Olgunに感謝しますが、メディアプレーヤーの再生は停止せず、オン/オフ画面のたびに新しいメディアプレーヤーオブジェクトが作成されます(複数の再生)。

SCBroadcaster.java

    public class SCBroadcaster extends BroadcastReceiver {
    PowerManager pm;
    MediaPlayer mp;
    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        mp = MediaPlayer.create(arg0, R.raw.gale);
        if (arg1.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                    mp.stop();
            mp.release();
            Toast.makeText(arg0, "oNONONO", Toast.LENGTH_LONG).show();

        } else if (arg1.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            mp.start();
        }

    }

}

MainActivity.java

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    BroadcastReceiver bre = new SCBroadcaster();
    registerReceiver(bre, filter);
}

protected void onPause() {
    super.onPause();
    if (SCBroadcaster.wasScreenOn) {
        System.out.println("SCREEN TURNED OFF");
    } else {

    }
}

protected void onResume() {
    super.onResume();
    if (!SCBroadcaster.wasScreenOn) {

    } else {

    }
}

}

4

4 に答える 4

13

ACTION_SCREEN を使用したアプローチはうまくいきませんでした。いくつかの異なる解決策の後、このコードは最終的に私の問題を解決しました:

/**
 * Is the screen of the device on.
 * @param context the context
 * @return true when (at least one) screen is on
 */
public boolean isScreenOn(Context context) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
        boolean screenOn = false;
        for (Display display : dm.getDisplays()) {
            if (display.getState() != Display.STATE_OFF) {
                screenOn = true;
            }
        }
        return screenOn;
    } else {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        //noinspection deprecation
        return pm.isScreenOn();
    }
}
于 2015-02-26T16:42:02.610 に答える
9

Intent.ACTION_SCREEN_OFF および ACTION_SCREEN_ON は、上記のブロードキャスト登録をチェックアウトします。ここで良い例を見つけることができます。

于 2012-11-09T11:54:10.863 に答える
3

これをアクティビティ内に追加してみてください。

IntentFilter filter = new IntentFilter(); 
filter.addAction(Intent.ACTION_SCREEN_OFF); 
BroadcastReceiver mReceiver = new ScreenReceiver(); 
registerReceiver(mReceiver, filter); 

同様に、追加することACTION_SCREEN_ONもできます

于 2012-11-09T18:40:27.883 に答える
0

やイベントBroadcastReceiverの背景Serviceに あなたを登録します。それは私のために働いた。Intent.ACTION_SCREEN_ONIntent.ACTION_SCREEN_OFF

于 2016-05-25T16:10:02.067 に答える