有没有人知道如何在Delphi Firemonkey上调暗屏幕?我一直在搜索和搜索,但只能找到如何通过获取Wakelock(Delphi XE5 Android. How to use PowerManager.WakeLock?)去除Android的汽车昏暗。Dim Screen Android Firemonkey
在最好的情况,我想实现两种状态: 晚报= 20%的亮度 白天= 100%亮度
我使用德尔福10.1柏林。 谢谢你的帮助。
有没有人知道如何在Delphi Firemonkey上调暗屏幕?我一直在搜索和搜索,但只能找到如何通过获取Wakelock(Delphi XE5 Android. How to use PowerManager.WakeLock?)去除Android的汽车昏暗。Dim Screen Android Firemonkey
在最好的情况,我想实现两种状态: 晚报= 20%的亮度 白天= 100%亮度
我使用德尔福10.1柏林。 谢谢你的帮助。
以this Stack Overflow question,它具有Java解决方案,作为引导我找到这个辅助单元应在德尔福版本一起从各地XE8至10.1柏林,这似乎这样的伎俩:
unit ScreenBrightnessU;
interface
function GetScreenBrightness: Byte;
procedure SetScreenBrightness(Brightness: Byte);
implementation
uses
MiscU,
FMX.Helpers.Android,
{$IF RTLVersion >= 31}
FMX.DialogService,
{$ELSE}
FMX.Dialogs,
{$ENDIF}
System.UITypes,
System.SysUtils,
Androidapi.Helpers,
Androidapi.JNI.App,
Androidapi.JNI.Provider,
Androidapi.JNI.GraphicsContentViewText;
function GetScreenBrightness: Byte;
var
Resolver: JContentResolver;
begin
Resolver :=
{$IF RTLVersion >= 30}
TAndroidHelper.ContentResolver;
{$ELSE}
SharedActivityContext.getContentResolver;
{$ENDIF}
Result := TJSettings_System.JavaClass.getInt(
Resolver,
TJSettings_System.JavaClass.SCREEN_BRIGHTNESS);
end;
procedure SetScreenBrightness(Brightness: Byte);
var
Resolver: JContentResolver;
AttainedBrightness: Single;
LayoutParams: JWindowManager_LayoutParams;
Window: JWindow;
begin
if not HasPermission('android.permission.WRITE_SETTINGS') then
{$IF RTLVersion >= 31}
TDialogService.MessageDialog('App does not have the WRITE_SETTINGS permission', TMsgDlgType.mtError, [TMsgDlgBtn.mbCancel], TMsgDlgBtn.mbCancel, 0, nil)
{$ELSE}
MessageDlg('App does not have the WRITE_SETTINGS permission', TMsgDlgType.mtError, [TMsgDlgBtn.mbCancel], 0)
{$ENDIF}
else
begin
{$IF RTLVersion >= 30}
Resolver := TAndroidHelper.ContentResolver;
{$ELSE}
Resolver := SharedActivityContext.getContentResolver;
{$ENDIF}
// This will set the manual mode (set the automatic mode off)
TJSettings_System.JavaClass.putInt(
Resolver,
TJSettings_System.JavaClass.SCREEN_BRIGHTNESS_MODE,
TJSettings_System.JavaClass.SCREEN_BRIGHTNESS_MODE_MANUAL);
// This will set the required brightness
TJSettings_System.JavaClass.putInt(
Resolver,
TJSettings_System.JavaClass.SCREEN_BRIGHTNESS,
Brightness);
try
AttainedBrightness := GetScreenBrightness;
CallInUIThread(
procedure
begin
{$IF RTLVersion >= 30}
Window := TAndroidHelper.Activity.getWindow;
{$ELSE}
Window := SharedActivity.getWindow;
{$ENDIF}
LayoutParams := Window.getAttributes;
LayoutParams.screenBrightness := AttainedBrightness/255;
Window.setAttributes(LayoutParams);
end);
except
// ONOES!!!!
// <sweeps issue under the carpet>
end;
end;
end;
end.
你会注意到代码通过下面的帮助器单元进行许可检查。只要您确保为项目中的所有Android构建配置设置了WRITE_SETTINGS
权限,这并不重要。
unit MiscU;
interface
function HasPermission(const Permission: string): Boolean;
implementation
uses
FMX.Helpers.Android,
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText;
function HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED
end;
end.
这工作像一个魅力,非常感谢。当我试图这样做时,我一定忘记了WRITE_SETTINGS! –
一个尴尬的快速和肮脏的解决方案 - 即不改变屏幕的属性,只是呈现的画面 - 将整个表单上使用'TContrastEffect'和亮度设置为'-0.8'。由于效果不会影响表单本身,因此内容本身必须放置到“TPanel”上,并将效果应用到面板上。 –