2016-09-22 17 views
3

Android用のDelphi Firemonkeyで画面を暗くする方法を知っている人はいますか?私は周りをグーグルで検索していましたが、Wakelock(Delphi XE5 Android. How to use PowerManager.WakeLock?)を取得してアンドロイドの自動調光を取り除く方法しか見つけられませんでした。Dim Screen Android Firemonkey

で最高の私は、2つの状態を達成したいと思います: イブニング= 20%の明るさ 昼間= 100%の明るさ

私は、Delphi 10.1ベルリンを使用しています。 ありがとうございます。

+0

恥ずかしい汚いクイック・アンド・ソリューション - スクリーンの特性を変化させないだけでレンダリングされた画像は、 - フォーム全体で 'TContrastEffect'を使用して' -0.8'に明るさを設定することになります。エフェクトはフォーム自体には影響しないので、コンテンツ自体は 'TPanel'とパネルに適用されるエフェクトに置かなければなりません。 –

答えて

2

私はXE8周りからトリックを行うようだ10.1ベルリンにDelphiのバージョンで動作するはずです。このヘルパーユニットをアップrustledガイドとして、Javaソリューションを持っているthis Stack Overflow questionを、撮影:

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ビルド設定でプロジェクトに権限が設定されていることを確認する限り、重要ではありません。

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を忘れてしまったに違いありません! –