[Android]从FLAG_SECURE禁止截屏看surface
在应用中,设置activity的flag为FLAG_SECURE就可以禁止截屏,截屏出来是黑色的,
试验一下,
注意事项
-
影响:
- 设置
FLAG_SECURE
标志后,用户将无法对该Activity进行截屏或录制屏幕。 - 这个标志会影响所有屏幕录制工具,不仅仅是截屏工具。
- 设置
-
适用场景:
- 这个标志适用于需要保护敏感信息的场景,例如银行应用、支付应用等。
-
用户体验:
- 用户可能会注意到屏幕录制或截屏功能被禁用,因此在使用这个标志时,最好在应用中提供相应的提示或说明。
完整示例
以下是一个完整的示例,展示了如何在一个简单的Android应用中禁止截屏。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This screen cannot be captured or recorded."
android:textSize="18sp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"/>
</LinearLayout>
MainActivity.java
package com.example.noscreenshot;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
// 设置 FLAG_SECURE 标志来禁止截屏
getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_SECURE);
}
@Override
protected void onPause() {
super.onPause();
// 可选:在不需要禁止截屏时移除 FLAG_SECURE 标志
// getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_SECURE);
}
}
可以发现,不能截屏了,使用screencap命令也不能截屏,再试验一下scrcpy工具
(https://github.com/Genymobile/scrcpy/releases)
这个和录屏类似,也是黑色的,但是其他的surface是可以看到的,使用分屏显示其他应用,
scrcpy的录屏是创建了一个display,这里可以猜测,系统中(surfaceflinger)对新创建的这个display也进行了surface的合成,而不是画面的复制。