我正在使用便携式项目,因此无法直接访问本机代码.
我的项目中有一个界面,允许我访问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
如果没有特定于平台的服务或渲染器,则无法执行此操作.便携式项目必须调用特定于平台的代码才能实现此目的.
从该平台特定代码,或者作为DependencyService
或Renderer
,您可以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)
现在有一个插件完全按照 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)