如何在屏幕镜像期间锁定Android屏幕?

Posted

技术标签:

【中文标题】如何在屏幕镜像期间锁定Android屏幕?【英文标题】:How to lock android screen during screen mirroring? 【发布时间】:2020-03-10 02:53:32 【问题描述】:

我正在开发一个 android 应用程序,用于将 android 屏幕镜像到车载显示器。我使用 MediaProjection 来获取屏幕;使用该 api 我能够镜像屏幕,现在我想在镜像期间锁定 android 屏幕以避免分散用户的注意力。

有没有办法在流式传输期间锁定 Android 设备屏幕?例如显示固定图片或冻结设备屏幕并流式传输其他布局?也许使用一些 API 等?

【问题讨论】:

欢迎来到 SO!一个问题应该有最少的内容:输入样本(如果需要)、预期输出样本(需要)、你尝试了什么、你研究了什么……你尝试了什么? 【参考方案1】:

我个人通过设置/清除标志来为用户锁定/解锁 UI:

//The user cannot interact with the UI
private void disableUserInteraction() 
    (getActivity()).getWindow()
            .setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);


//The user can interact with the UI
private void enableUserInteraction() 
    (getActivity()).getWindow()
            .clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

这将阻止用户与屏幕进行交互。 然后,您可以创建一个带有灰色的 RelativeLayout,以使用户明显需要等待,并在执行您的操作时使用它的可见性:

<LinearLayout
    android:id="@+id/loading_mask"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:background="#B0000000"
    android:visibility="gone"/>

您还可以同时添加一个 ProgressDialog,以显示/关闭:

//The UI message to show the user during the loading 
private void showProgressDialog() 
    if (progressDialog == null) 
        progressDialog = new ProgressDialog(Objects.requireNonNull(getParentFragment())
                .getActivity());
        progressDialog.setIndeterminate(true);
        progressDialog.setCancelable(false);
    
    progressDialog.setMessage("Loading...");
    progressDialog.show();


private void dismissProgressDialog() 
    if (progressDialog != null) 
        progressDialog.dismiss();
    

如果你把这三个结合起来,我认为它是一个很好的等待屏幕,那么你可以像这样把这些方法放在一起:

//The user can interact with the UI, end of progressdialog and waiting mask
private void unlockUI() 
    loadingMask.setVisibility(View.GONE);
    dismissProgressDialog();
    enableUserInteraction();


//The user cannot interact with the UI, start of progressdialog and waiting mask
private void lockUI() 
    showProgressDialog();
    disableUserInteraction();
    loadingMask.setVisibility(View.VISIBLE);

您只需要在启动时调用 lockUI() 并在用户可以再次与屏幕交互时调用 unlockUI()。

希望这会有所帮助,让我们知道进展如何!

【讨论】:

感谢您的回答。但是如果我这样做,屏幕将被锁定在两侧。汽车显示屏和手机。我只想锁定 Android 屏幕并仅在车载显示屏上显示屏幕。

以上是关于如何在屏幕镜像期间锁定Android屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中启用“在锁定屏幕中显示”权限

如何在Android中锁定屏幕时长按电源按钮启用GPS?

Android如何在屏幕上显示通知

屏幕锁定时如何通知推送通知?

即使屏幕在Android中被锁定,也会启动活动屏幕

默认锁定屏幕上的 Android 活动