Bagaimana mencegah Tangkapan Layar di Android

118

Apakah mungkin untuk mencegah perekaman layar di Aplikasi Android?

Saya ingin mengembangkan Aplikasi Aman Android. Dalam hal itu saya perlu mendeteksi perangkat lunak perekaman layar yang menjalankan latar belakang dan mematikannya. Saya telah menggunakan BENDERA AMAN untuk mencegah tangkapan layar. Tapi saya tidak tahu apakah mungkin untuk mencegah perekaman Video dari Layar Android juga. Beri tahu saya cara mencegah pengambilan layar (video / tangkapan layar).

Anand
sumber
8
- Anda harus ingat seseorang selalu dapat mengarahkan kamera ke layar untuk mencuri konten - Ada beberapa teknik yang digunakan di bidang DRM tetapi cukup rumit dan saya tidak begitu tahu apa yang terjadi di balik tenda
Shai Levy
9
Konsep yang dijelaskan oleh @ShaiLevy, biasanya disebut Analog Hole en.wikipedia.org/wiki/Analog_hole yang menjelaskan lubang keamanan yang tak terhindarkan dari transmisi media.
gusridd

Jawaban:

126

Saya akan mengatakan bahwa tidak mungkin untuk sepenuhnya mencegah tangkapan layar / video dari aplikasi Android apa pun melalui cara yang didukung. Tetapi jika Anda hanya ingin memblokirnya secara normal perangkat Android , BENDERA AMAN sangat besar.

1) Bendera aman memblokir tangkapan layar normal dan pengambilan video.

Juga dokumentasi di tautan ini mengatakan itu

Bendera jendela: perlakukan konten jendela sebagai aman, cegah agar tidak muncul di tangkapan layar atau agar tidak dilihat di tampilan yang tidak aman.

Solusi di atas pasti akan mencegah aplikasi menangkap Video aplikasi Anda

Lihat jawabannya disini .

2) Ada cara alternatif untuk menangkap konten layar.

Dimungkinkan untuk menangkap layar aplikasi lain pada perangkat yang di-rooting atau melalui menggunakan SDK,

yang keduanya menawarkan sedikit atau tidak ada kesempatan bagi Anda untuk memblokirnya atau menerima pemberitahuan tentangnya.

Misalnya: terdapat perangkat lunak untuk mencerminkan layar ponsel Anda ke komputer melalui SDK sehingga perangkat lunak penangkap layar dapat digunakan di sana, tidak dapat ditemukan oleh aplikasi Anda.

Lihat jawabannya disini .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
sumber
11
atau seseorang dapat mengklik gambar dengan kamera genggam.
Ravinder Payal
68

Tambahkan saja baris ini:

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

Sebelum setContentView()metode Anda .

Ido Naveh
sumber
11
Pertanyaan: [kutipan] Saya telah menggunakan SECURE FLAG [hapus tanda kutip] "Jawaban" Anda: [kutipan] Anda dapat menggunakan FLAG_SECURE [unqote] Apakah Anda menemukan masalah di sini?
Lihat
Hai, saya sedang mengembangkan aplikasi portal berbasis web. Pengguna dapat menggunakan semua jenis browser untuk mencapai portal ini. Pengguna portal ini tidak boleh mengambil tangkapan layar saat mereka menggunakan perangkat seluler. Dapatkah saya menggunakan tindakan pencegahan yang sama (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) untuk aplikasi web. Apakah ini berfungsi untuk IOS? Jika saya dapat menggunakan jenis pencegahan yang sama di mana saya harus memanggil saluran ini?
Ferda-Ozdemir-Sonmez
24

Untuk menonaktifkan Tangkapan Layar:

Tambahkan baris kode berikut dalam onCreate()metode:

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

Untuk mengaktifkan Tangkapan Layar:

Temukan LayoutParams.FLAG_SECUREdan hapus baris kode tersebut.

Rajesh Shetty
sumber
12

Untuk pengguna Java, tulis baris ini di atas setContentView(R.layout.activity_main);

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

Untuk pengguna kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
pengguna9778021
sumber
untuk kotlin, bergantung pada konteksnya, itu seharusnya window?.set...karena di Dialog, Anda tidak tahu apakah Anda akan memiliki Window.
Martin Marconcini
1
Pertanyaan asli sudah mengatakan mereka telah menggunakan bendera aman dan jawaban Anda adalah menggunakan bendera aman. Ini tidak benar-benar menjawab pertanyaan yang diposting.
Subaru Tashiro
10

Tampaknya Anda tahu cara menonaktifkan tangkapan layar dari aplikasi Anda dan ada jawaban lain yang membantu Anda dalam hal itu. Tetapi saya akan mencoba memberi Anda beberapa informasi penting yang tidak diberikan siapa pun kepada Anda.

1) Anda tidak dapat memiliki aplikasi yang 100% aman dari mengambil tangkapan layar (foto / video). Tidak ada cara resmi untuk mengambil tangkapan layar di Android. Jika aplikasi merekam layar, maka itu harus menggunakan beberapa metode yang tidak didukung (baik rooting atau menggunakan SDK).

Ada sangat sedikit ruang bagi Anda untuk memblokir aplikasi jika menggunakan akses root untuk merekam layar.

2) Tidak ada yang menyebutkan masalah ini di sini, tetapi berhati-hatilah saat menggunakan WindowManager.LayoutParams.FLAG_SECURE. Telah diverifikasi di banyak perangkat (seperti pada Samsung Galaxy ACE, misalnya GT-S5830), bahwa ini membuat seluruh tampilan menjadi acak. Seperti ini,

masukkan deskripsi gambar di sini

Tolong beri tanda centang seperti ini,

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

Ini berfungsi dengan sempurna pada perangkat ICS, jadi tidak ada masalah di sana.

3) Saya juga menemukan bahwa bahkan pada perangkat yang lebih baru seperti Android 4.3, ini menyebabkan masalah animasi saat layar diputar. Silakan periksa laporan bug ini.

Aritra Roy
sumber
28
Anda tidak boleh hanya menyalin dan menempel jawaban orang lain untuk mendapatkan suara. Dan juga tambahkan referensi dari mana Anda menyalin jawaban Anda. stackoverflow.com/a/11121897/5437621
mrid
jawaban Anda adalah salin dan tempel, tolong jangan salin dan tempel jawaban seseorang. Anda telah menyalin jawaban ini dari tautan yang disebutkan di bawah ini. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Anda dapat menjadikan aplikasi Anda sebagai perangkat / pemilik profil dan panggilan setScreenCaptureDisabled(). Dari dokumen , api ini melakukan hal berikut:

public void setScreenCaptureDisabled (admin ComponentName, boolean dinonaktifkan) Ditambahkan dalam API level 21

Dipanggil oleh perangkat / pemilik profil untuk menyetel apakah tangkapan layar dinonaktifkan. Menonaktifkan tangkapan layar juga mencegah konten ditampilkan pada perangkat tampilan yang tidak memiliki keluaran video aman. Lihat FLAG_SECURE untuk detail selengkapnya tentang permukaan yang aman dan tampilan yang aman.

Admin perangkat yang menelepon haruslah pemilik perangkat atau profil. Jika tidak, pengecualian keamanan akan dilemparkan. Admin parameter Dengan DeviceAdminReceiver yang terkait dengan permintaan ini. dinonaktifkan Apakah tangkapan layar dinonaktifkan atau tidak.

Atau Anda bisa menjadi MDM (Manajemen Perangkat Seluler) aplikasi mitra OEM menyediakan API tambahan ke aplikasi mitra MDM mereka untuk mengontrol perangkat. Misalnya samsung menyediakan api untuk mengontrol perekaman layar pada perangkat ke mitra MDM mereka.

Saat ini, hanya dengan cara inilah Anda dapat menerapkan batasan tangkapan layar.

rupesh jain
sumber
9

Coba ini:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PS
sumber
3
Pertanyaan: [kutipan] Saya telah menggunakan SECURE FLAG [hapus tanda kutip] "Jawaban" Anda: [kutipan] Anda dapat menggunakan FLAG_SECURE [unqote] Apakah Anda menemukan masalah di sini?
Lihat
Bendera jendela: perlakukan konten jendela sebagai aman, cegah agar tidak muncul di tangkapan layar atau agar tidak dilihat di tampilan yang tidak aman. Lihat FLAG_SECURE untuk detail selengkapnya tentang permukaan yang aman dan tampilan yang aman. Nilai Konstan: 8192 (0x00002000) Baca lebih lanjut dari sini developer.android.com/reference/android/view/…
Jithu PS
Harap jangan merusak postingan Anda dengan mengembalikan perbaikan kami
FelixSFD
8

Saya melihat semua jawaban yang hanya sesuai untuk satu aktivitas tetapi ada solusi saya yang akan memblokir tangkapan layar untuk semua aktivitas tanpa menambahkan kode apa pun ke aktivitas. Pertama-tama buat kelas Aplikasi Kustom dan tambahkan. registerActivityLifecycleCallbacksKemudian daftarkan di manifes Anda.

MyApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

Nyata

 <application
        android:name=".MyApplicationContext"
        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">
Gk Mohammad Emon
sumber
apakah ini berfungsi di semua kasus?
gopalanrc
Saya mencoba proyek saya kemudian berhasil untuk semua aktivitas. @gopalanrc
Gk Mohammad Emon
2

Menurut panduan resmi ini , Anda dapat menambahkan WindowManager.LayoutParams.FLAG_SECUREtata letak jendela Anda dan itu akan melarang tangkapan layar.

r5d
sumber
2

Saya menggunakan solusi ini untuk memungkinkan snapshot manual dalam aplikasi sambil melarang tangkapan layar saat aplikasi berjalan di latar belakang, semoga membantu.

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}
S. Bozzoni
sumber
0

tentang tangkapan layar foto, FLAG_SECURE tidak berfungsi pada perangkat yang di-rooting.

tetapi jika Anda memantau file tangkapan layar, Anda dapat mencegah mendapatkan file asli.

coba ini satu .

1. memantau tangkapan layar (monitor file) dengan layanan jarak jauh android
2. menghapus gambar tangkapan layar asli.
3. mengirimkan instance bitmap sehingga Anda dapat memodifikasi.

Soo Chun Jung
sumber