Delphi实现禁止与允许App截屏
<p>修改AndroidManifest.template.xml,增加下面标粗的内容:</p><div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">activity
</span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="com.embarcadero.firemonkey.FMXNativeActivity"</span><span style="color: rgba(255, 0, 0, 1)">
android:exported</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><strong><span style="color: rgba(255, 0, 0, 1)">
android:excludeFromRecents</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)">
android:noHistory</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)">
android:windowDisablePreview</span><span style="color: rgba(0, 0, 255, 1)">="true"</span></strong><span style="color: rgba(255, 0, 0, 1)">
android:label</span><span style="color: rgba(0, 0, 255, 1)">="%activityLabel%"</span><span style="color: rgba(255, 0, 0, 1)">
android:configChanges</span><span style="color: rgba(0, 0, 255, 1)">="orientation|keyboard|keyboardHidden|screenSize"</span><span style="color: rgba(255, 0, 0, 1)">
android:launchMode</span><span style="color: rgba(0, 0, 255, 1)">="singleTask"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> Tell NativeActivity the name of our .so </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">meta-data </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.app.lib_name"</span><span style="color: rgba(255, 0, 0, 1)"> android:value</span><span style="color: rgba(0, 0, 255, 1)">="%libNameValue%"</span> <span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">intent-filter</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">action </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.intent.action.MAIN"</span> <span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">category </span><span style="color: rgba(255, 0, 0, 1)">android:name</span><span style="color: rgba(0, 0, 255, 1)">="android.intent.category.LAUNCHER"</span> <span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">intent-filter</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">activity</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>在Form.OnCreate中增加代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm16.FormCreate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
//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);//用这个写法,</span>SharedActivity是旧版本了!</pre>
<pre></pre>
<pre></pre>
<pre><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>要手动引用三个单元:Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers</p>
<p>11.3,华为、小米测试通过。</p>
<p>2023-05-29:</p>
<p>如果一个项目有多个Form,而用户只是想其中一个Form不允许截屏,那怎么办呢?</p>
<p>可以这样实现:</p>
<p>当禁止截屏的Form打开时,执行:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm17.FormActivate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
TAndroidHelper.Activity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>当关闭这个Form时再执行允许截屏的代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm17.FormDeactivate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
TAndroidHelper.Activity.getWindow.clearFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>针对上面的代码,可以进一步提练出两个方法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> EnableCaptureScreen;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFDEF ANDROID</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
TAndroidHelper.Activity.getWindow.clearFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ENDIF</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> DisableCaptureScreen;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFDEF ANDROID</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
TAndroidHelper.Activity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_SECURE);
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ENDIF</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p> </p>
<p>注意:</p>
<p>1.这两个方法EnableCaptureScreen与DisableCaptureScreen,不用配对调用。不管你调用几次DisableCaptureScreen,只要调用EnableCaptureScreen,就允许截屏了!</p>
<p>2.这两个方法可随时调用,想禁止截屏,就调用DisableCaptureScreen,想允许截屏,就调用EnableCaptureScreen。</p>
<p>3.TAndroidHelper.Activity.getWindow对于Delphi FMX开发的App来说,可以理解为是全局变量,也就是说,当Form1调用Form2,在Form2中执行了DisableCaptureScreen,返回Form1,这时候也是禁止截屏的。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/kinglandsoft/p/17428548.html
頁:
[1]