2016-09-22 83 views
3

有没有人知道如何在Delphi Firemonkey上调暗屏幕?我一直在搜索和搜索,但只能找到如何通过获取Wakelock(Delphi XE5 Android. How to use PowerManager.WakeLock?)去除Android的汽车昏暗。Dim Screen Android Firemonkey

在最好的情况,我想实现两种状态: 晚报= 20%的亮度 白天= 100%亮度

我使用德尔福10.1柏林。 谢谢你的帮助。

+0

一个尴尬的快速和肮脏的解决方案 - 即不改变屏幕的属性,只是呈现的画面 - 将整个表单上使用'TContrastEffect'和亮度设置为'-0.8'。由于效果不会影响表单本身,因此内容本身必须放置到“TPanel”上,并将效果应用到面板上。 –

回答

2

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. 
+0

这工作像一个魅力,非常感谢。当我试图这样做时,我一定忘记了WRITE_SETTINGS! –