जब मेरा ऐप बैकग्राउंड में चला जाता है तो मैं एंड्रॉइड को स्क्रीनशॉट लेने से कैसे रोक सकता हूं?


146

वर्तमान में मैं जिस ऐप का निर्माण कर रहा हूं, उसकी आवश्यकता है कि ऐप को सुरक्षा कारणों से पृष्ठभूमि में धकेल दिए जाने पर ऐप का स्क्रीनशॉट लेने के लिए ओएस को रोकना होगा। इस तरह यह ऐप्स के बीच स्विच करने पर अंतिम सक्रिय स्क्रीन को देखने में सक्षम नहीं होगा।

मैं इस कार्यक्षमता को एप्लिकेशन क्लास की ऑनपॉज़ विधि में डालने की योजना बना रहा हूं, लेकिन पहले मुझे यह पता लगाना होगा कि मैं इस कार्यक्षमता को कैसे प्राप्त कर सकता हूं।

तो क्या वहां कोई बाहर है, इसका कोई सुराग है कि इसे कैसे ठीक किया जाए?

जवाबों:


264

कोशिश करें FLAG_SECURE:

public class FlagSecureTestActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

    setContentView(R.layout.main);
  }
}

यह निश्चित रूप से आईसीएस हाल के कार्यों के इतिहास से मैनुअल स्क्रीनशॉट और स्वचालित स्क्रीनशॉट के खिलाफ सुरक्षित है। यह स्क्रीन रिकॉर्डिंग (जैसे, मीडिया प्रोजेक्शन एपीआई का उपयोग करने वाले ऐप्स) के खिलाफ भी सुरक्षित है।

अद्यतन : यह एंड्रॉइड 6.0 पर अब ऑन टैप या अन्य सहायकों के खिलाफ भी सुरक्षित करता है; यदि उपयोगकर्ता सहायक को लाता है तो उन्हें आपके UI में विजेट्स और कंटेनरों के विवरण तक पहुंच नहीं मिलेगी।

अद्यतन # 2 : हालांकि, गतिविधि में सब कुछ संरक्षित नहीं होगा। कोई पॉप-अप विंडो - Dialog, Spinner, AutoCompleteTextView, कार्रवाई बार अतिप्रवाह, आदि - असुरक्षित हो जाएगा। आप उस पर Dialogकॉल करके getWindow()और सेटिंग करके समस्या को ठीक कर सकते हैं FLAG_SECURE। बाकी ... मुश्किल हो जाता है। अधिक के लिए इस ब्लॉग पोस्ट को देखें ।


6
@ डैनी: वास्तव में, यह सवाल के साथ क्या करना है सब कुछ है। मैंने इसे केवल एक नेक्सस एस (4.0.3) पर परीक्षण किया था, और यह उम्मीद के मुताबिक काम करता है - हाल ही में किए गए कार्य स्क्रीनशॉट को दबा दिया गया है। आप अभी भी एप्लिकेशन का नाम और आइकन देखते हैं, लेकिन स्क्रीनशॉट काला है। ICS हार्डवेयर पर इसे आज़माने के लिए आपका स्वागत है।
कॉमंसवेयर

2
@ StingRay5: FLAG_SECUREशुरुआत से ही अस्तित्व में है - इसका हाल ही तक सीमित अर्थ था।
कॉमंसवेयर

1
यह ध्यान रखना दिलचस्प है कि एक तरीका है जिसे onCreateThumbnail ni गतिविधि जीवनचक्र कहा जाता है, लेकिन इसका उपयोग कभी नहीं किया जाता है।
Snicolas

2
@ पंकजकुमार: यदि आपने "स्क्रीन शॉट लेने के लिए कोड" लिखा है, तो यह है कि क्लासिक "फ्रेमबफ़र को रूट" ट्रिक के रूप में पकड़ो, FLAG_SECUREइससे बचाव नहीं होगा, क्योंकि यह बहुत कम-स्तर है। इसी तरह, अगर आप अपने खुद के विजेट पदानुक्रम ले लिया है और यह एक करने के लिए आकर्षित किया था Bitmapसमर्थित Canvas, FLAG_SECUREशायद उस के खिलाफ, रक्षा करेंगे नहीं के रूप में आप अपने खुद के विगेट्स के अपने खुद के स्क्रीनशॉट ले जा रहे हैं और इसलिए शायद चाहता था वहाँ में "सुरक्षित" वाले। सिस्टम स्क्रीनशॉट के FLAG_SECUREलिए है , जैसे कि हाल के कार्यों के थंबनेल।
कॉमन्सवेयर

2
अद्भुत और सरल उत्तर! मैं सोच रहा हूँ कि स्नैपचैट जैसे ऐप किसी को भेजे गए चित्रों के स्क्रीनशॉट लेने से रोकने के लिए इसका उपयोग क्यों नहीं करते हैं।
शोभित पुरी

78

WindowManager.LayoutParams.FLAG_SECURE का उपयोग करने के बारे में सावधान रहें, कुछ उपकरणों पर (सैमसंग गैलेक्सी 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);
}

यह एक तले हुए स्क्रीन जैसा दिखता है:

तले हुए स्क्रीन छवि

हालांकि यह आईसीएस सैमसंग फोन पर ठीक से काम कर रहा है, इसलिए मुझे लगता है कि समस्या जिंजरब्रेड उपकरणों (या पुराने) से अलग है।


8
आप पूरी तरह से सही हैं, हम इस मुद्दे पर आए थे, और निश्चित रूप से एपीआई स्तर की जांच करने की आवश्यकता थी। वास्तव में यह पोस्ट करना भूल गया, इसलिए इसे फिर से लाने के लिए धन्यवाद। :)
स्टिंगरेय 5

यह सैमसंग जियो (जिंजरब्रेड) पर भी होता है, लेकिन फ्रायो पर इसका ठीक - ठीक ऐसा केवल 2.3 पर होता है
पिक्सेल

हमने इस समस्या पर भी ध्यान दिया। आप जिंजरब्रेड उपकरणों पर एमुलेटर में सत्यापित कर सकते हैं।
twaddington

मैं यह भी पुष्टि कर सकता हूं कि यह समस्या सैमसंग जिंजरब्रेड उपकरणों पर दिखाई देती है।
इरनिर एर्लिंगसन

7
यहां तक कि नए Android संस्करण पर FLAG_SECURE समस्या हो सकती है: Android 4.3 FLAG_SECURE स्क्रीन रोटेशन एनीमेशन में एनीमेशन समस्याओं का कारण बनता, देख code.google.com/p/android/issues/detail?id=58632 - इस Android 4.4 पर तय किया गया है
ओलिवर

13

कॉमन्सवेयर द्वारा प्रदान किया गया समाधान लॉलीपॉप में भी मान्य है।

बस एक नोट, यदि आप पूरे ऐप के लिए हाल की सूची में स्नैपशॉट नहीं देखना जारी रखना चाहते हैं, तो सभी कार्यान्वित गतिविधियों से पहले ध्वज को विधि में निर्दिष्ट करना चाहिएonCreate()getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);setContentView();

अन्यथा हाल की सूची में एक स्नैपशॉट ध्वज के बिना पहली गतिविधि दिखाएगा यदि उपयोगकर्ता इसके माध्यम से नेविगेट करता है।


1
मेरे एप्लिकेशन में, मेरे पास उपयोगकर्ता प्राथमिकता के आधार पर FLAG_SECURE को सेट / क्लियर करने की कार्यक्षमता है। यह तब तक ठीक काम करता है जब तक कि केकटैट और ब्लैक स्क्रीन को टास्क स्विचर में नहीं देखा जा सकता। लॉलीपॉप में, अवलोकन मेरे ऐप के अंतिम स्नैपशॉट को प्रदर्शित करता है, वह समय जब FLAG_SECURE सेट नहीं किया गया था (स्पष्ट)।
आर। भारद्वाज

@ r.bhardwaj मुझे लगता है कि हम उस मामले में बहुत कुछ नहीं कर सकते हैं, लेकिन आप उपयोगकर्ता को सलाह दे सकते हैं कि, परिवर्तन की आवश्यकता है ऐप को पूरी तरह से प्रभावी होने के लिए फिर से शुरू करना होगा ;-) और आप कर रहे हैं।
डेविडस

1
किसी को भी स्नैपशॉट लेने से पहले कस्टम दृश्य को भड़काने का एक तरीका मिला, इसलिए यह केवल एक काली स्क्रीन नहीं है? मैंने ऑनपॉज़ में विंडो मैनेजर पर एक दृश्य दिखाने की कोशिश की है, लेकिन ऐसा लगता है कि तब तक बहुत देर हो चुकी है।
user1064249

हाय @ user1064249 क्या आपको कोई समाधान मिला है? मैं ओएस को स्क्रीनशॉट लेने से पहले लांचर व्यू को बढ़ाना चाहता हूं
एलेक्सिस्कनी

1

यहाँ एप्लिकेशन की सामग्री को छिपाने के लिए एक स्प्लैश स्क्रीन के साथ कवर करने के लिए एक समाधान है जब ऐप को पृष्ठभूमि में रखा जाता है। यह FLAG_SECURE तकनीक का उपयोग नहीं कर रहा है, मैं बस ऑनपॉइंट और स्क्रीन के onResume तरीकों को ओवरराइड करता हूं और एक को दिखाने के लिए दृश्य को संशोधित करता हूं जो पीछे की हर चीज को कवर करता है।

https://stackoverflow.com/a/52976001/6686912


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

यह मेरे लिए काम करता है, यह स्क्रीनशॉट लेने से रोकता है और रिकॉर्डिंग स्क्रीन से किसी इनबिल्ट या थर्ड पार्टी रिकॉर्डिंग एप्लिकेशन को भी।


0

हर गतिविधि के सेट-कॉन्टेंट व्यू से पहले ऑनक्रिएट में इन लाइन को जोड़ने के बाद मेरे लिए यह काम है।

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,     
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.