2015-01-20 5 views
3

Hелло guуs, я хочу разблокировать телефон с сервисом. Я использую диспетчер аварийных сообщений. приемник и обслуживание были добавлены явить , а также разрешения на RECEIVE_BOOT_COMPLETE и WAKE_LOCK AlarmReceiverWake phone from unlock screen android

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     setAlarms(context); 
    } 

    public static void setAlarms(Context context) { 
     cancelAlarms(context); 
     PendingIntent pIntent = createPendingIntent(context); 
     Calendar calendar = Calendar.getInstance(); 
     setAlarm(context, calendar, pIntent); 
    } 

    @SuppressLint("NewApi") 
    private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) { 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent); 
     } 
    } 

    public static void cancelAlarms(Context context) { 
        PendingIntent pIntent = createPendingIntent(context); 
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
        alarmManager.cancel(pIntent); 
    } 

    private static PendingIntent createPendingIntent(Context context) { 
     Intent intent = new Intent(context, AlarmService.class); 
     return PendingIntent.getService(context, 777, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    } 
} 

AlarmService

public class AlarmService extends Service { 

    public static String TAG = AlarmService.class.getSimpleName(); 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Intent alarmIntent = new Intent(getBaseContext(), MainActivity.class); 
     alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     alarmIntent.putExtras(intent); 
     getApplication().startActivity(alarmIntent); 

     //AlarmManagerHelper.setAlarms(this); 
     Log.e("SERVICE_WORKING","YEEEES!!!!"); 

     return super.onStartCommand(intent, flags, startId); 
    } 

} 

MainActivity

Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0); 
AlarmManager alarmManager=(AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis()+10000, pendingIntent); 

Он отлично работает, но если я заблокируйте экран не разблокирует его.

+3

Я не поймал, что вы подразумеваете под разблокировкой телефона? Вы хотели бы разблокировать телефон, даже если у него есть пароль или контакт для разблокировки - и переход из режима сна в устройство находится на экране с запущенным состоянием запуска? Значит, в этом случае это невозможно, я думаю. – krossovochkin

+0

Извините, я имел в виду разблокировать экран –

ответ

0

Если вы просто ищете MainActivity, чтобы показывать, когда телефон заблокирован, есть флаги Window, которые можно установить в onCreate(), чтобы это произошло.

FLAG_SHOW_WHEN_LOCKED позволит вашей активности быть видимой пользователю, когда телефон заблокирован, а FLAG_DISMISS_KEYGUARD разблокирует телефон, если пользователь не настроил защитную блокировку (pin/pattern/face/etc).

Window window = this.getWindow(); 
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
+0

Я хочу запустить рингтон и предупредить пользователя, как будильник –

+0

Я также использовал флаги FLAG_TURN_SCREEN_ON и FLAG_ALLOW_LOCK_WHILE_SCREEN_ON. Это сработало, но я видел, как другие люди использовали PowerManager? правильно ли использовать PowerManager? –

+0

Было много изменений леденец на powermanager & wakelocks. Вы можете взглянуть на AlarmActivity.java (стандартный будильник для Android), чтобы узнать, как они это делают - https://android.googlesource.com/platform/packages/apps/DeskClock/+/dfd1960/src/com/ андроид/DeskClock/тревоги/AlarmActivity.java –

0

Вы можете вызвать пробуждение экрана только с помощью будильника. Вы не можете разблокировать экран программно. Это приведет к обходу безопасности, которую пользователь выбрал, что запрещено. Обратите внимание, что прямо сейчас вы используете PendingIntent с вашим будильником, чтобы начать Service, который, в свою очередь, начинает Activity. Это не гарантируется, если устройство находится в состоянии низкой мощности. Если вам нужно разбудить устройство, используйте PendingIntent для BroadcastReceiver, который, в свою очередь, принимает вакелон и начинает Service. Затем Service может предпринять соответствующие действия и освободить wakelock. Система обеспечит, чтобы накопитель был достаточно длинным для завершения вашего метода приемника onReceive(). Он не выполняет (и не может) сделать то же самое для запуска Service или Activity с будильника.

+0

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

+0

Да. Вам также необходимо убедиться, что «BroadcastReceiver» использует wakelock, а «Сервис» выпускает его, когда он делает то, что он делает при пробуждении. В противном случае существует вероятность того, что система вернется спать до того, как «Сервис» когда-либо будет запущен. –

+0

Мне нужно использовать PowerManager для блокировки бодрствования? –