唤醒锁在 android 棒棒糖 (API 21) 5.0.2 中不起作用
Wake Lock not working in android lollipop (API 21) 5.0.2
我正在使用 "Call" 应用程序。
我在 API 21 中发布 'wake lock' 时遇到问题。(它与 > Kitkat API 但 API 21 一起工作正常)。
我开始调用 activity 的代码是:
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();
我在调用 activity.
中尝试了这段代码
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" />
我发现使用创建一个 activity 并在其中设置标志 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;
}
}
}
并且还在调用 activity 中设置标志。
我正在使用 "Call" 应用程序。
我在 API 21 中发布 'wake lock' 时遇到问题。(它与 > Kitkat API 但 API 21 一起工作正常)。
我开始调用 activity 的代码是:
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();
我在调用 activity.
中尝试了这段代码 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" />
我发现使用创建一个 activity 并在其中设置标志 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;
}
}
}
并且还在调用 activity 中设置标志。