Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách ngăn chặn ghi màn hình (screen recording) trong Android

Hướng dẫn này minh họa cách bảo vệ nội dung nhạy cảm khỏi bị ghi màn hình hoặc screenshot bằng cờ FLAG_SECURE trên Window.

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project.

Bước 2: Giao diện đơn giản (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/rlMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Màn hình này không thể chụp ảnh/ghi video"
        android:textSize="18sp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="50dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Thử chụp màn hình (Power + Volume Down) hoặc dùng app ghi màn hình"
        android:textSize="14sp"
        android:textColor="#666666"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="16dp"
        android:padding="16dp"/>

</LinearLayout>

Bước 3: Bật FLAG_SECURE (src/MainActivity.java)

package app.com.sample;

import android.os.Bundle;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // QUAN TRỌNG: Gọi TRƯỚC setContentView()
        getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE
        );
        setContentView(R.layout.activity_main);
    }
}

Bước 4: Manifest (androidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

⚙️ Giải thích FLAG_SECURE

  • Ngăn chặn **screenshot** (Power + Volume Down)
  • Ngăn chặn **screen recording** (thuộc tính màn hình, app thứ 3)
  • Ngăn chặn **hiển thị trên recent apps** (hiện thumbnail trắng/đen)
  • Không ảnh hưởng đến **adb shell screencap** (cần root)

🎯 Áp dụng cho toàn bộ App (BaseActivity)

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE
        );
        super.onCreate(savedInstanceState);
    }
}

// Các Activity khác extends BaseActivity

🔓 Loại trừ màn hình cụ thể (cho phép screenshot)

// Trong Activity muốn cho phép screenshot
@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_allow_capture);
}

⚠️ Hạn chế

  • Không chặn được: chụp ảnh bằng camera vật lý, HDMI capture card, root/exploit
  • Một số OEM (Samsung, Xiaomi) có thể bypass FLAG_SECURE cho system screen recorder
  • Không nên dùng cho toàn app trừ khi cần thiết (ảnh hưởng UX, debugging)

Test thủ công

  1. Cài app lên thiết bị
  2. Mở app → thử chụp màn hình (Power + Vol Down) → ảnh chụp sẽ trắng/đen
  3. Cài app ghi màn hình (AZ Recorder, Mobizen...) → quay → xem kết quả trắng/đen

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Thử chụp màn hình hoặc ghi màn hình để kiểm tra bảo vệ.