对话锁定来电屏幕
dialog over lock incoming call screen
我希望对话框和来电屏幕都可以点击。我已经从该站点尝试过不同的解决方案,但有些在某些条件下有效,而另一些则无效。我想创建一个像 true caller 这样的应用程序,我从 BroadcastReceiver
调用了一个 activity。当屏幕未锁定时,我的代码可以完美运行,因为传入屏幕不是全屏。但是当屏幕全屏时,对话框 activity 在调用屏幕上出现几毫秒,然后在调用屏幕后面。
这是我从 BroadcastReceiver
调用的 activity 代码
public class IncomingCallActivity extends AppCompatActivity {
private static final int MSG_ID_CHECK_TOP_ACTIVITY = 1;
private String userName;
private String TAG = IncomingCallActivity.class.getSimpleName();
private Window wind;
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
/*private ActivityManager mActivityManager;
private boolean mDismissed = false;*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wind = this.getWindow();
wind.requestFeature(Window.FEATURE_NO_TITLE);
wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
wind.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
wakeLock.acquire();
setContentView(R.layout.activity_incoming_call);
userName = getIntent().getStringExtra(IncomingCallReceiver.NAME_KEY);
final TextView textView = (TextView) findViewById(R.id.tvUsername);
textView.setText(userName);
final ImageView ivCancel = (ImageView) findViewById(R.id.ivCancel);
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wakeLock.release();
IncomingCallActivity.this.finish();
}
});
}
}
//Add Permissions in Manifest file and don't forget to check overlay permission
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
//Create Class Level Variable or as per requirement
WindowManager.LayoutParams mWindowsParams;
WindowManager mWindowManager;
View mDialogView;
//initialize variable
mWindowsParams =new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
mWindowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
//Add Window on your event
mWindowManager.addView(mDialogView, mWindowsParams);
//For Remove window
if (mDialogView.getParent() != null) {
try {
mWindowManager.removeViewImmediate(mDialogView);
} catch (Exception e) {
}
}
我希望对话框和来电屏幕都可以点击。我已经从该站点尝试过不同的解决方案,但有些在某些条件下有效,而另一些则无效。我想创建一个像 true caller 这样的应用程序,我从 BroadcastReceiver
调用了一个 activity。当屏幕未锁定时,我的代码可以完美运行,因为传入屏幕不是全屏。但是当屏幕全屏时,对话框 activity 在调用屏幕上出现几毫秒,然后在调用屏幕后面。
这是我从 BroadcastReceiver
调用的 activity 代码public class IncomingCallActivity extends AppCompatActivity {
private static final int MSG_ID_CHECK_TOP_ACTIVITY = 1;
private String userName;
private String TAG = IncomingCallActivity.class.getSimpleName();
private Window wind;
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
/*private ActivityManager mActivityManager;
private boolean mDismissed = false;*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wind = this.getWindow();
wind.requestFeature(Window.FEATURE_NO_TITLE);
wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
wind.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
wakeLock.acquire();
setContentView(R.layout.activity_incoming_call);
userName = getIntent().getStringExtra(IncomingCallReceiver.NAME_KEY);
final TextView textView = (TextView) findViewById(R.id.tvUsername);
textView.setText(userName);
final ImageView ivCancel = (ImageView) findViewById(R.id.ivCancel);
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wakeLock.release();
IncomingCallActivity.this.finish();
}
});
}
}
//Add Permissions in Manifest file and don't forget to check overlay permission
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
//Create Class Level Variable or as per requirement
WindowManager.LayoutParams mWindowsParams;
WindowManager mWindowManager;
View mDialogView;
//initialize variable
mWindowsParams =new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
mWindowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
//Add Window on your event
mWindowManager.addView(mDialogView, mWindowsParams);
//For Remove window
if (mDialogView.getParent() != null) {
try {
mWindowManager.removeViewImmediate(mDialogView);
} catch (Exception e) {
}
}