2016-09-12 8 views
0

"Call"앱으로 작업하고 있습니다.Wake Lock이 안드로이드 롤리팝 (API 21) 5.0.2에서 작동하지 않습니다.

API 21에서 'wake lock'을 해제하는 데 문제가 있습니다. (Kitkat API는 있지만 API 21에서는 잘 작동합니다). 통화 활동을 시작하는

내 코드는 다음과 같습니다

Intent callIntent = new Intent(context, CallActivity.class); 
        callIntent.putExtra(QBServiceConsts.EXTRA_OPPONENTS, (Serializable) qbUsersList); 
        callIntent.putExtra(QBServiceConsts.EXTRA_START_CONVERSATION_REASON_TYPE, 
          StartConversationReason.INCOME_CALL_FOR_ACCEPTION); 
        callIntent.putExtra(QBServiceConsts.EXTRA_CONFERENCE_TYPE, qbConferenceType); 
        callIntent.putExtra(QBServiceConsts.EXTRA_SESSION_DESCRIPTION, qbRtcSessionDescription); 
        callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.getApplicationContext().startActivity(callIntent); 

이 장치의 잠금을 해제하는 것입니다.

km = (KeyguardManager) context .getSystemService(Context.KEYGUARD_SERVICE); 
       kl = km .newKeyguardLock("MyKeyguardLock"); 
       kl.disableKeyguard(); 
       PowerManager pm = (PowerManager) context .getSystemService(Context.POWER_SERVICE); 
       wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
       wakeLock.acquire(); 

이 코드는 통화 활동에서 시도했습니다.

Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

그리고 내 매니페스트는 다음과 같습니다

<activity 
      android:name=".ui.activities.call.CallActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" 
      android:launchMode="singleTask" 
      android:screenOrientation="portrait" /> 
+0

좋은 질문 !!! –

답변

1

내가 사용 솔루션은 하나 개의 활동을 작성하고 있다는 점에서 플래그 keyguard_dismiss를 설정하는 것이 발견하고있다.

public class KeyGuardDismissActivity extends Activity { 

    private ScreenOnReceiver receiver; 
    public static final String TAG = KeyGuardDismissActivity.class.getSimpleName(); 
    private static List<QBUser> qbUsersList; 
    private static QBRTCTypes.QBConferenceType qbConferenceType; 
    private static QBRTCSessionDescription qbRtcSessionDescription; 

    public static KeyGuardDismissActivity instance; 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Log.e(TAG,"Start keyguard dismisser!"); 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
      startActivity(new Intent(getApplicationContext(),CallActivity.class)); 
      finish(); 
      return; 
     } 

     qbUsersList = (ArrayList<QBUser>)getIntent().getSerializableExtra(QBServiceConsts.EXTRA_OPPONENTS); 
     qbConferenceType = (QBRTCTypes.QBConferenceType) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_CONFERENCE_TYPE); 
     qbRtcSessionDescription = (QBRTCSessionDescription) getIntent().getExtras().getSerializable(QBServiceConsts.EXTRA_SESSION_DESCRIPTION); 

     instance = this; 
     receiver = new ScreenOnReceiver(); 
//  registerReceiver(receiver, receiver.getFilter()); 

     Intent broadcast = new Intent(KeyGuardDismissActivity.this, ScreenOnReceiver.class); 
     sendBroadcast(broadcast); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     instance = this; 
    } 

    public void dismissingKeyguard() { 
     Log.e(TAG, "Dismissing keyguard!"); 

     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Intent yourRealActivity = new Intent(getApplicationContext(), CallActivity.class); 
       yourRealActivity.putExtra(QBServiceConsts.EXTRA_OPPONENTS, (Serializable) qbUsersList); 
       yourRealActivity.putExtra(QBServiceConsts.EXTRA_START_CONVERSATION_REASON_TYPE, 
         StartConversationReason.INCOME_CALL_FOR_ACCEPTION); 
       yourRealActivity.putExtra(QBServiceConsts.EXTRA_CONFERENCE_TYPE, qbConferenceType); 
       yourRealActivity.putExtra(QBServiceConsts.EXTRA_SESSION_DESCRIPTION, qbRtcSessionDescription); 
       yourRealActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(yourRealActivity); 
//    if (receiver != null) { 
//     unregisterReceiver(receiver); 
//    } 
      } 
     }, 1000); 

     finish(); 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
       | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    } 

    public static class ScreenOnReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.e(TAG,"Screen on, yay!"); 
      KeyGuardDismissActivity.instance.dismissingKeyguard(); 
     } 

     public IntentFilter getFilter() { 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction(Intent.ACTION_SCREEN_ON); 
      return filter; 
     } 
    } 
} 

또한 통화 활동에서도 플래그를 설정합니다.

+0

좋습니다 !!!!!!!!!!!!!!!! –