【问题标题】:dialog over lock incoming call screen锁定来电屏幕的对话框
【发布时间】:2017-03-09 03:58:30
【问题描述】:

我希望对话框和来电屏幕都可以点击。我已经尝试了该站点的不同解决方案,但有些在某些条件下有效,而另一些则无效。我想创建一个像真正的呼叫者这样的应用程序,我已经从BroadcastReceiver 调用了一个活动。当屏幕未锁定时,我的代码可以完美运行,因为传入的屏幕不是全屏的。但是当屏幕全屏时,对话活动会在调用屏幕上显示几毫秒,然后在调用屏幕后面。

这是我从 BroadcastReceiver 调用的活动代码

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();
        }
    });

}

}

【问题讨论】:

    标签: android dialog call incoming-call


    【解决方案1】:
         //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) {
    
                 }
            }
    

    【讨论】:

    • 我也试过这个,它会使传入的屏幕无法点击,我希望两个屏幕都可以点击。
    • 添加相同的窗口参数你不会遇到这个问题。我使用相同的代码来显示弹出来电。并尝试将对话框视图添加为 LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(上下文.LAYOUT_INFLATER_SERVICE); mDialogView = inflater.inflate(R.layout.small_pop_up_layout, null);
    • 是的,它与给定的参数一起工作。非常感谢 Gautam。我挣扎了很久。
    • TYPE_SYSTEM_ERROR 已弃用。有什么选择吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多