วิธีป้องกันการจับภาพหน้าจอใน Android


118

เป็นไปได้หรือไม่ที่จะป้องกันการบันทึกหน้าจอในแอปพลิเคชัน Android

ฉันต้องการพัฒนาแอปพลิเคชันที่ปลอดภัยของ Android ในนั้นฉันจำเป็นต้องตรวจจับซอฟต์แวร์บันทึกหน้าจอที่ทำงานอยู่เบื้องหลังและฆ่าพวกมัน ฉันใช้ SECURE FLAG เพื่อป้องกันภาพหน้าจอ แต่ฉันไม่รู้ว่าเป็นไปได้หรือไม่ที่จะป้องกันการจับภาพวิดีโอของหน้าจอ Android ด้วย แจ้งให้เราทราบวิธีป้องกันการจับภาพหน้าจอ (วิดีโอ / ภาพหน้าจอ)


8
- คุณควรจำไว้ว่าเราสามารถเล็งกล้องบนหน้าจอเพื่อขโมยเนื้อหาได้เสมอ - มีเทคนิคบางอย่างที่ใช้ในฟิลด์ DRM แต่มันค่อนข้างซับซ้อนและฉันไม่รู้จริงๆว่าเกิดอะไรขึ้นภายใต้ประทุน
Shai Levy

9
แนวคิดที่ @ShaiLevy อธิบายมักเรียกว่า Analog Hole en.wikipedia.org/wiki/Analog_holeซึ่งอธิบายถึงช่องโหว่ด้านความปลอดภัยที่หลีกเลี่ยงไม่ได้ของการส่งสื่อ
gusridd

คำตอบ:


126

ฉันจะบอกว่ามันไม่สามารถป้องกันการจับภาพหน้าจอ / วิดีโอของแอพ Android ใด ๆได้อย่างสมบูรณ์ด้วยวิธีการที่รองรับ แต่ถ้าคุณเพียงต้องการที่จะปิดกั้นมันปกติอุปกรณ์ Android, ธงปลอดภัยเป็นอย่างมาก

1)ค่าสถานะปลอดภัยจะบล็อกทั้งภาพหน้าจอปกติและการจับภาพวิดีโอ

นอกจากนี้เอกสารที่ลิงค์นี้ยังระบุว่า

การตั้งค่าสถานะหน้าต่าง: ถือว่าเนื้อหาของหน้าต่างปลอดภัยป้องกันไม่ให้ปรากฏในภาพหน้าจอหรือไม่ให้ดูบนจอแสดงผลที่ไม่ปลอดภัย

โซลูชันข้างต้นจะป้องกันไม่ให้แอปพลิเคชันจับภาพวิดีโอของแอปของคุณ

ดูคำตอบที่นี่

2)มีวิธีอื่นในการจับภาพเนื้อหาบนหน้าจอ

อาจเป็นไปได้ที่จะจับภาพหน้าจอของแอพอื่นบนอุปกรณ์ที่รูทหรือผ่าน SDK

ซึ่งทั้งสองให้โอกาสเพียงเล็กน้อยหรือไม่มีเลยที่คุณจะบล็อกหรือรับการแจ้งเตือน

ตัวอย่างเช่นมีซอฟต์แวร์ที่ใช้สะท้อนหน้าจอโทรศัพท์ของคุณไปยังคอมพิวเตอร์ผ่าน SDK ดังนั้นจึงสามารถใช้ซอฟต์แวร์จับภาพหน้าจอได้ที่แอปของคุณไม่สามารถค้นพบได้

ดูคำตอบที่นี่

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

11
หรือคลิกที่ภาพด้วยกล้องมือถือ
Ravinder Payal

68

เพียงเพิ่มบรรทัดนี้:

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

ก่อนsetContentView()วิธีการของคุณ


11
คำถาม: [quote] ฉันใช้ SECURE FLAG [unquote] "คำตอบ" ของคุณ: [quote] คุณสามารถใช้ FLAG_SECURE [unqote] คุณสามารถระบุปัญหาที่นี่ได้หรือไม่
2 ดี

สวัสดีฉันกำลังพัฒนาแอปพลิเคชันพอร์ทัลบนเว็บ ผู้ใช้สามารถใช้เบราว์เซอร์ชนิดใดก็ได้เพื่อเข้าถึงพอร์ทัลนี้ ผู้ใช้พอร์ทัลนี้ไม่ควรจับภาพหน้าจอเมื่อใช้อุปกรณ์มือถือ ฉันสามารถใช้ข้อควรระวังเดียวกัน (etWindow (). setFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) สำหรับเว็บแอปพลิเคชันได้หรือไม่ ใช้งานได้กับ IOS หรือไม่ ถ้าฉันสามารถใช้ข้อควรระวังประเภทเดียวกันได้ฉันควรเรียกบรรทัดนี้ว่าที่ไหน?
Ferda-Ozdemir-Sonmez

24

ในการปิดการจับภาพหน้าจอ:

เพิ่มบรรทัดรหัสต่อไปนี้ในonCreate()วิธีการ:

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

ในการเปิดใช้งานการจับภาพหน้าจอ:

ค้นหาLayoutParams.FLAG_SECUREและลบบรรทัดของรหัส


13

สำหรับผู้ใช้ Java ให้เขียนบรรทัดนี้ไว้เหนือไฟล์ setContentView(R.layout.activity_main);

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

สำหรับผู้ใช้ kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

สำหรับ kotlin ขึ้นอยู่กับบริบทนั่นควรเป็นwindow?.set...เพราะใน Dialogs คุณไม่รู้ว่าคุณจะมี Window หรือไม่
Martin Marconcini

1
คำถามเดิมบอกว่าพวกเขาใช้การตั้งค่าสถานะที่ปลอดภัยแล้วและคำตอบของคุณคือใช้ค่าสถานะที่ปลอดภัย นี่ไม่ได้ตอบคำถามที่โพสต์ไว้จริงๆ
Subaru Tashiro

10

ดูเหมือนว่าคุณจะรู้วิธีปิดการใช้งานภาพหน้าจอจากแอปของคุณและมีคำตอบอื่น ๆ ที่ช่วยคุณได้ แต่ฉันจะพยายามให้ข้อมูลสำคัญบางอย่างที่ไม่มีใครให้คุณ

1) คุณไม่สามารถมีแอปที่ปลอดภัย 100% จากการจับภาพหน้าจอ (ภาพถ่าย / วิดีโอ) นอกจากนี้ไม่มีทางอย่างเป็นทางการที่จะใช้ภาพหน้าจอใน Android หากแอปกำลังบันทึกหน้าจอแอปนั้นจะต้องใช้วิธีการบางอย่างที่ไม่รองรับ (ไม่ว่าจะเป็นการรูทหรือใช้ SDK)

มีขอบเขตน้อยมากที่คุณจะบล็อกแอปหากใช้การเข้าถึงรูทเพื่อบันทึกหน้าจอ

2) ไม่มีใครกล่าวถึงปัญหานี้ที่นี่ WindowManager.LayoutParams.FLAG_SECUREแต่ต้องระวังให้มากในขณะที่ใช้ ได้รับการตรวจสอบแล้วในหลายอุปกรณ์ (เช่นบน Samsung Galaxy ACE เช่น GT-S5830) ซึ่งทำให้มุมมองทั้งหมดมีสัญญาณรบกวน แบบนี้,

ใส่คำอธิบายภาพที่นี่

กรุณาใส่เครื่องหมายเช่นนี้

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

ทำงานได้อย่างสมบูรณ์บนอุปกรณ์ ICS ดังนั้นจึงไม่มีปัญหา

3) ฉันยังพบว่าแม้ในอุปกรณ์รุ่นใหม่ ๆ เช่น Android 4.3 สิ่งนี้จะทำให้เกิดปัญหาเกี่ยวกับภาพเคลื่อนไหวเมื่อหมุนหน้าจอ โปรดตรวจสอบรายงานข้อบกพร่องนี้


28
คุณไม่ควรคัดลอกและวางคำตอบของคนอื่นเพื่อรับคะแนนเสียง และยังเพิ่มข้อมูลอ้างอิงว่าคุณคัดลอกคำตอบมาจากที่ใด stackoverflow.com/a/11121897/5437621
mrid

คำตอบของคุณคือคัดลอกและวางโปรดอย่าคัดลอกและวางคำตอบของใครบางคน คุณได้คัดลอกคำตอบนี้จากลิงค์ด้านล่างนี้ stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

คุณสามารถทำให้แอปของคุณเป็นเจ้าของอุปกรณ์ / โปรไฟล์และโทรsetScreenCaptureDisabled()ได้ จาก เอกสาร api นี้ทำสิ่งต่อไปนี้:

โมฆะสาธารณะ setScreenCaptureDisabled (ผู้ดูแลระบบ ComponentName ปิดใช้งานบูลีน) ใน API ระดับ 21

เรียกโดยเจ้าของอุปกรณ์ / โปรไฟล์เพื่อตั้งค่าว่าจะปิดใช้งานการจับภาพหน้าจอหรือไม่ การปิดใช้งานการจับภาพหน้าจอยังป้องกันไม่ให้เนื้อหาแสดงบนอุปกรณ์แสดงผลที่ไม่มีเอาต์พุตวิดีโอที่ปลอดภัย ดู FLAG_SECURE สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับพื้นผิวที่ปลอดภัยและจอแสดงผลที่ปลอดภัย

ผู้ดูแลระบบอุปกรณ์โทรต้องเป็นเจ้าของอุปกรณ์หรือโปรไฟล์ หากไม่เป็นเช่นนั้นข้อยกเว้นด้านความปลอดภัยจะถูกโยนทิ้งไป ผู้ดูแลระบบพารามิเตอร์ซึ่ง DeviceAdminReceiver คำร้องขอนี้เชื่อมโยงกับ ปิดใช้งานไม่ว่าจะปิดการจับภาพหน้าจอหรือไม่

หรือคุณสามารถเป็นแอพคู่ค้าMDM (Mobile Device Management) ได้ OEM จะให้ API เพิ่มเติมไปยังแอพพันธมิตร MDM เพื่อควบคุมอุปกรณ์ตัวอย่างเช่น samsung ให้ api เพื่อควบคุมการบันทึกหน้าจอบนอุปกรณ์ให้กับพาร์ทเนอร์ MDM

ขณะนี้เป็นวิธีเดียวที่คุณสามารถบังคับใช้ข้อ จำกัด การจับภาพหน้าจอได้


9

ลองสิ่งนี้:

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

3
คำถาม: [quote] ฉันใช้ SECURE FLAG [unquote] "คำตอบ" ของคุณ: [quote] คุณสามารถใช้ FLAG_SECURE [unqote] คุณสามารถระบุปัญหาที่นี่ได้หรือไม่
2 ดี

การตั้งค่าสถานะหน้าต่าง: ถือว่าเนื้อหาของหน้าต่างปลอดภัยป้องกันไม่ให้ปรากฏในภาพหน้าจอหรือไม่ให้ดูบนจอแสดงผลที่ไม่ปลอดภัย ดู FLAG_SECURE สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับพื้นผิวที่ปลอดภัยและจอแสดงผลที่ปลอดภัย ค่าคงที่: 8192 (0x00002000) อ่านเพิ่มเติมจากที่นี่developer.android.com/reference/android/view/…
Jithu PS

โปรดอย่าทำให้โพสต์ของคุณ
เสื่อมเสีย

8

ฉันเห็นคำตอบทั้งหมดที่เหมาะสมสำหรับกิจกรรมเดียวเท่านั้น แต่มีวิธีแก้ปัญหาของฉันซึ่งจะบล็อกภาพหน้าจอสำหรับกิจกรรมทั้งหมดโดยไม่ต้องเพิ่มรหัสใด ๆ ในกิจกรรม ก่อนอื่นให้สร้างคลาส Custom Application และเพิ่ม a จากregisterActivityLifecycleCallbacksนั้นลงทะเบียนในไฟล์ Manifest ของคุณ

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) {
            }
        });
    }



}

ประจักษ์

 <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">

ฉันลองทำโครงการของฉันแล้วมันก็ใช้ได้กับทุกกิจกรรม @gopalanrc
Gk Mohammad Emon


2

ฉันใช้วิธีนี้เพื่ออนุญาตสแนปชอตด้วยตนเองในแอพในขณะที่ไม่อนุญาตให้จับภาพหน้าจอเมื่อแอปทำงานอยู่เบื้องหลังหวังว่าจะช่วยได้

@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();
}

0

เกี่ยวกับภาพหน้าจอ FLAG_SECURE ไม่ทำงานอุปกรณ์ที่รูท

แต่หากคุณตรวจสอบไฟล์ภาพหน้าจอคุณสามารถป้องกันไม่ให้รับไฟล์ต้นฉบับได้

ลองนี้อย่างใดอย่างหนึ่ง

1. การตรวจสอบภาพหน้าจอ (การตรวจสอบไฟล์) ด้วยบริการระยะไกลของ Android
2. ลบภาพหน้าจอต้นฉบับ
3. ส่งมอบอินสแตนซ์บิตแมปเพื่อให้คุณสามารถแก้ไขได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.