红鱼儿

Delphi实现禁止与允许App截屏

修改AndroidManifest.template.xml,增加下面标粗的内容:

        <activity
            android:name="com.embarcadero.firemonkey.FMXNativeActivity"
            android:exported="true"

            android:excludeFromRecents="true"
            android:noHistory="true"
            android:windowDisablePreview="true"

            android:label="%activityLabel%"
            android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
            android:launchMode="singleTask">
            <!-- Tell NativeActivity the name of our .so -->
            <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

在Form.OnCreate中增加代码:

procedure TForm16.FormCreate(Sender: TObject);
begin
  //SharedActivity.getWindow.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE, TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
  TAndroidHelper.Activity.getWindow.setFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE, TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);//用这个写法,SharedActivity是旧版本了!


end;

要手动引用三个单元:Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers

11.3,华为、小米测试通过。

2023-05-29:

如果一个项目有多个Form,而用户只是想其中一个Form不允许截屏,那怎么办呢?

可以这样实现:

当禁止截屏的Form打开时,执行:

procedure TForm17.FormActivate(Sender: TObject);
begin
   TAndroidHelper.Activity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
end;

当关闭这个Form时再执行允许截屏的代码:

procedure TForm17.FormDeactivate(Sender: TObject);
begin
   TAndroidHelper.Activity.getWindow.clearFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
end;

针对上面的代码,可以进一步提练出两个方法:

procedure EnableCaptureScreen;
begin
{$IFDEF ANDROID}
TAndroidHelper.Activity.getWindow.clearFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
{$ENDIF}
end;

procedure DisableCaptureScreen;
begin
{$IFDEF ANDROID}
TAndroidHelper.Activity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
{$ENDIF}
end;

 

注意:

1.这两个方法EnableCaptureScreen与DisableCaptureScreen,不用配对调用。不管你调用几次DisableCaptureScreen,只要调用EnableCaptureScreen,就允许截屏了!

2.这两个方法可随时调用,想禁止截屏,就调用DisableCaptureScreen,想允许截屏,就调用EnableCaptureScreen。

3.TAndroidHelper.Activity.getWindow对于Delphi FMX开发的App来说,可以理解为是全局变量,也就是说,当Form1调用Form2,在Form2中执行了DisableCaptureScreen,返回Form1,这时候也是禁止截屏的。

 

posted on 2023-05-24 15:46  红鱼儿  阅读(850)  评论(0编辑  收藏  举报