Mendeteksi kapan pengguna mengambil screenshot perangkat

Pesan bertuliskan 'Aplikasi berbayar mendeteksi screenshot ini'
Gambar 1. Contoh pesan toast yang disediakan sistem dan muncul saat pengguna mengambil screenshot aplikasi yang mendukung API deteksi screenshot.

Untuk membuat pengalaman yang lebih standar dalam mendeteksi screenshot, Android 14 memperkenalkan API deteksi screenshot yang menjaga privasi. API ini memungkinkan aplikasi mendaftarkan callback per aktivitas. Callback ini dipanggil, dan pengguna akan diberi tahu saat pengguna mengambil screenshot ketika aktivitas itu terlihat.

Kasus penggunaan yang didukung

Di Android 14, API sistem hanya mendeteksi screenshot jika pengguna melakukan kombinasi penekanan tombol fisik tertentu. API tidak mendeteksi screenshot yang diambil saat menjalankan perintah pengujian terkait screenshot, termasuk ADB, atau dalam uji instrumentasi yang mengambil konten layar saat ini di perangkat.

Langkah-langkah implementasi

Untuk menambahkan deteksi screenshot, deklarasikan izin waktu penginstalan DETECT_SCREEN_CAPTURE yang baru:

<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />

Kemudian, selesaikan langkah-langkah berikut untuk setiap aktivitas di aplikasi Anda yang dapat digunakan pengguna untuk mengambil screenshot:

  1. Implementasikan callback dengan mengganti fungsi onScreenCapture(). Dalam callback ini, aplikasi Anda dapat mengambil tindakan, seperti memperingatkan pengguna lain bahwa seseorang mengambil screenshot percakapan pesan.

    Kotlin

    val screenCaptureCallback = Activity.ScreenCaptureCallback {
        // Add logic to take action in your app.
    }
    

    Java

    final Activity.ScreenCaptureCallback screenCaptureCallback =
        new Activity.ScreenCaptureCallback() {
            @Override
            public void onScreenCaptured() {
                // Add logic to take action in your app.
            }
        };
    
  2. Dalam metode onStart() aktivitas, daftarkan callback screenshot.

    Kotlin

    override fun onStart() {
        super.onStart()
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(mainExecutor, screenCaptureCallback)
    }
    

    Java

    @Override
    protected void onStart() {
        super.onStart();
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(executor, screenCaptureCallback);
    }
    
  3. Dalam metode onStop() aktivitas, batalkan pendaftaran callback screenshot:

    Kotlin

    override fun onStop() {
        super.onStop()
        unregisterScreenCaptureCallback(screenCaptureCallback)
    }
    

    Java

    @Override
    protected void onStop() {
        super.onStop();
        unregisterScreenCaptureCallback(screenCaptureCallback);
    }
    

Kemampuan kontrol untuk mengambil screenshot

Jika Anda tidak ingin konten aktivitas aplikasi muncul dalam screenshot, atau di layar yang tidak aman, tetapkan flag tampilan FLAG_SECURE.

Kotlin

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE)

Java

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);