Начать действие, даже когда телефон Android находится в заблокированном режиме / на экране блокировки

Как я могу начать свою деятельность, даже когда телефон находится в заблокированном режиме, чтобы я мог получить доступ к своему приложению?

Я хочу сначала включить будильник, используя ringAlarm(), а затем перейти к другому действию, которое будет отображать alertdialog, чтобы остановить будильник.

Он отлично работает, если телефон активен, но когда телефон заблокирован, он просто постоянно подает сигнал тревоги, и к тому времени, когда я разблокирую телефон, кнопка остановки сигнала тревоги не активируется. Пожалуйста помогите. Спасибо за помощь заранее.

Вот мой код:

public class EAlarmReceiver extends BroadcastReceiver {
public static String sender;
public static String sms = "";
public static Ringtone r;
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Bundle bundle = intent.getExtras(); 
    Object[] pdusObj = (Object[]) bundle.get("pdus"); 
    SmsMessage[] messages = new SmsMessage[pdusObj.length]; 
    for (int i = 0; i<pdusObj.length; i++) 
    { 
            messages[i] = SmsMessage.createFromPdu ((byte[]) 
            pdusObj[i]); 
            sender = messages[i].getOriginatingAddress();
            sms = messages[i].getMessageBody();//save sms to string
    } 

    for (SmsMessage msg : messages) {
        if (msg.getMessageBody().contains("alert")) {

            Intent openStopAlarm = new Intent("proj.receiver.STOPALARM");
            openStopAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY);
            ringAlarm(context);
            context.startActivity(openStopAlarm);
            abortBroadcast();
        }//end if
    }//end for
}// end onreceive

//ring the alarm
public void ringAlarm(Context context)
{
     Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
     if(alert == null){
         // alert is null, using backup
         alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
         if(alert == null){  // 
             // alert backup is null, using 2nd backup
             alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);               
         }
     }
     r = RingtoneManager.getRingtone(context.getApplicationContext(), alert);
     AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
     int maxVolumeAlarm = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
     int maxVolumeRing = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
     audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
     audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolumeAlarm,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
     audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolumeRing,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
     r.play();
        Toast.makeText(context.getApplicationContext(), "alarm started", Toast.LENGTH_LONG).show();
}
//end ringAlarm()
}

Я видел код о том, как это сделать, но я не знал, как его использовать. так что у меня все еще та же проблема. Вот код.

public class DismissLock extends Activity {

PowerManager pm;
WakeLock wl;
KeyguardManager km;
KeyguardLock kl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Log.i("INFO", "onCreate() in DismissLock");
    pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    km=(KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
    kl= km.newKeyguardLock("INFO");
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.ON_AFTER_RELEASE, "INFO");
    wl.acquire(); //wake up the screen
    kl.disableKeyguard();// dismiss the keyguard

    setContentView(R.layout.main);
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    wl.release(); 
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    wl.acquire();//must call this!
}

}

person Tokuchi Toua    schedule 28.01.2013    source источник


Ответы (2)


Вам просто нужно установить несколько дополнительных флагов окна:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
        + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
        + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Источник: Активность Android на экране блокировки по умолчанию

person Oleg Vaskevich    schedule 28.01.2013
comment
как мне вставить его в мой код. потому что я получил сообщение об ошибке, в котором говорится, что getWindow() не определен. извините за нубский вопрос - person Tokuchi Toua; 28.01.2013
comment
Вы должны иметь возможность вызывать его из Activity. - person Oleg Vaskevich; 28.01.2013
comment
вызвать любой класс, как я могу использовать - person Ashish Shahi; 13.04.2017

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
    + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
    + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

вставьте приведенный выше код в то действие, которое вы хотите выполнить на экране блокировки. поместите код внутрь oncreate();

person Neeraj    schedule 21.12.2015