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,这时候也是禁止截屏的。