保持某些页面的屏幕已打开

sos*_*sil 3 xamarin.forms

我正在使用便携式项目,因此无法直接访问本机代码.

我的项目中有一个界面,允许我访问Android/iOS项目中的本机对象.我们主要用它来播放音频.

例如,Android有类似的东西

Window w = new Window();
w.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.KeepScreenOn);
Run Code Online (Sandbox Code Playgroud)

然而,主要问题是访问Window对象.我可以将一个Xamarin.Forms.Page对象传递给本机代码,但是没有办法(我不认为)将它转换为本机Android Window对象来访问标志.

有没有办法用便携式项目做到这一点?

Tim*_*ers 11

如果没有特定于平台的服务或渲染器,则无法执行此操作.便携式项目必须调用特定于平台的代码才能实现此目的.

从该平台特定代码,或者作为DependencyServiceRenderer,您可以Window通过访问该对象Forms.Context.这Forms.Context是您的Android Activity,您可以通过它访问Window对象.

在Android上它的工作方式如下:

Android.Views.Window window = (Forms.Context as Activity).Window;
window.SetFlags(WindowManagerFlags.KeepScreenOn);
Run Code Online (Sandbox Code Playgroud)

在iOS上你可以尝试这个(Apple文档):

UIApplication.SharedApplication.IdleTimerDisabled = true;
Run Code Online (Sandbox Code Playgroud)


bat*_*aci 5

现在有一个插件完全按照 Tim 编写的方式执行

https://learn.microsoft.com/en-us/xamarin/essentials/screen-lock

简单的源代码在这里

https://github.com/xamarin/Essentials/blob/main/Samples/Samples/ViewModel/KeepScreenOnViewModel.cs

使用系统.Windows.输入;使用 Xamarin.Essentials;使用 Xamarin.Forms;

namespace Samples.ViewModel
{
    public class KeepScreenOnViewModel : BaseViewModel
    {
        public KeepScreenOnViewModel()
        {
            RequestActiveCommand = new Command(OnRequestActive);
            RequestReleaseCommand = new Command(OnRequestRelease);
        }

        public bool IsActive => DeviceDisplay.KeepScreenOn;

        public ICommand RequestActiveCommand { get; }

        public ICommand RequestReleaseCommand { get; }

        void OnRequestActive()
        {
            DeviceDisplay.KeepScreenOn = true;

            OnPropertyChanged(nameof(IsActive));
        }

        void OnRequestRelease()
        {
            DeviceDisplay.KeepScreenOn = false;

            OnPropertyChanged(nameof(IsActive));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)