2015-01-20 2 views
3

안녕하세요, 서비스와 함께 전화를 잠금 해제하고 싶습니다. 나는 경보 관리자를 사용하고있다. 수신기 및 서비스 RECEIVE_BOOT_COMPLETE 및 WAKE_LOCK 에 대한 AlarmReceiver잠금 해제 화면에서 전화 깨우기 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를 찾고있는 경우 onCreate()에서 설정할 수있는 Window 플래그가 있습니다.

FLAG_SHOW_WHEN_LOCKED는 휴대 전화가 잠겨있을 때 사용자에게 표시되도록하고 FLAG_DISMISS_KEYGUARD는 사용자가 보안 (핀/패턴/얼굴/기타) 키 가드를 구성하지 않은 경우 전화를 잠금 해제합니다.

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

rington을 시작하고 알람 시계처럼 사용자에게 경고하고 싶습니다. –

+0

FLAG_TURN_SCREEN_ON 및 FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 플래그도 사용했습니다. 그것은 효과가 있었지만 다른 사람들이 PowerManager를 사용하는 것을 보았습니까? PowerManager를 사용하는 것이 맞습니까? –

+0

powermanager & wakelocks에는 많은 롤리팝 변경 사항이있었습니다. 그들이하는 일을보기 위해 AlarmActivity.java (표준 안드로이드 알람 시계)를보고 싶을 수도 있습니다 - https://android.googlesource.com/platform/packages/apps/DeskClock/+/dfd1960/src/com/ android/deskclock/alarms/AlarmActivity.java –

0

wakelock을 사용하여 알람을 통해 화면을 깨우기 만 할 수 있습니다. 프로그래밍 방식으로 화면 잠금을 해제 할 수 없습니다. 이는 사용자가 선택한 보안을 우회 할 수는 있지만 허용되지 않습니다.

또한 지금은 을 알람과 함께 사용하여 Service을 시작하여 Activity을 시작합니다. 장치가 저전력 상태 일 때 작동하는 것은 아닙니다. 기기를 깨우려면 BroadcastReceiverPendingIntent을 사용하고 잠깐 잠깐 걸어서 Service을 시작합니다. 그런 다음 Service은 적절한 조치를 취하고 wakelock을 해제 할 수 있습니다. 시스템은 수신자의 onReceive() 메소드가 완료 될 수있을만큼 길게 wockockock을 유지하도록합니다. 알람에서 Service 또는 Activity을 시작하는 경우에도 동일한 작업을 수행하지 않으며 수행 할 수 없습니다.

+0

덕분에 보류중인 의도에서 서비스를 시작하지 말고 BroadcastReceiver를 시작한 다음 수신기에서 서비스를 시작해야합니까? –

+0

예. 또한'BroadcastReceiver'가 wakelock을 가져와야하고'Service'가 깨어나서 무엇을 하던지 끝내면 해제해야합니다. 그렇지 않으면 '서비스'가 실행되기 전에 시스템이 다시 잠자기 상태로 돌아갈 수 있습니다. –

+0

절전 모드 해제를 위해 PowerManager를 사용해야합니까? –

관련 문제