যখন আমার অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে যায় তখন আমি কীভাবে অ্যান্ড্রয়েডকে স্ক্রিনশট নেওয়া আটকাতে পারি?


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 এর অন্যান্য সহকারীদের বিরুদ্ধেও সুরক্ষিত করে; যদি ব্যবহারকারী সহকারীকে নিয়ে আসে তবে তারা আপনার ইউআইতে উইজেট এবং ধারকগুলির বিশদে অ্যাক্সেস পাবে না।

আপডেট # 2 : তবে ক্রিয়াকলাপের সমস্ত কিছুই সুরক্ষিত হবে না। কোন পপ আপ উইন্ডো - Dialog, Spinner, AutoCompleteTextView, অ্যাকশন বার ওভারফ্লো, ইত্যাদি - অসুরক্ষিত হতে হবে। আপনি Dialogফোন getWindow()করে এবং সেটিংস করে সমস্যার সমাধান করতে পারেন FLAG_SECURE। বাকী ... জটিল হয়ে ওঠে। আরও জন্য এই ব্লগ পোস্ট দেখুন।


6
@ ড্যানিজ: আসলে প্রশ্নটির সাথে এর সবই আছে। আমি এটি কেবলমাত্র একটি Nexus S (4.0.3) এ পরীক্ষা করেছি এবং এটি প্রত্যাশার মতো কাজ করে - সাম্প্রতিক-কার্যগুলির স্ক্রিনশট দমন করা হয়েছে। আপনি এখনও অ্যাপ্লিকেশন নাম এবং আইকন দেখতে পাচ্ছেন, তবে স্ক্রিনশটটি কালো। আইসিএস হার্ডওয়্যার এ চেষ্টা করে দেখতে আপনাকে স্বাগত জানাই।
কমন্সওয়্যার

2
@ স্টিংআর 5: FLAG_SECUREশুরু থেকেই অস্তিত্ব ছিল - এটির সাম্প্রতিকতম অর্থ সীমাবদ্ধ ছিল।
কমন্সওয়েয়ার

1
আকর্ষণীয় বিষয় লক্ষনীয় যে ক্রিয়াকলাপের জীবনচক্র অন অনক্রিট তুম্বনেল এনআই নামে একটি পদ্ধতি রয়েছে তবে এটি কখনও ব্যবহৃত হয় না।
Snicolas

2
@ পঙ্কজকুমার: আপনার লেখা "স্ক্রিন শট নেওয়ার কোড" যদি সেই ক্লাসিক হয় তবে "ফ্রেমবফারকে মূল হিসাবে ধরুন" কৌশলটি এর FLAG_SECUREবিরুদ্ধে রক্ষা করবে না, কারণ এটি খুব নিম্ন স্তরের। একইভাবে, যদি আপনার নিজস্ব উইজেট অনুক্রমের গ্রহণ এবং এটি একটি থেকে আঁকা ছিল Bitmapসমর্থিত Canvas, FLAG_SECUREসম্ভবত বিরুদ্ধে রক্ষা করব না আপনি আপনার নিজের উইজেট আপনার নিজের স্ক্রীনশট নেওয়া এবং সেজন্য সম্ভবতঃ চেয়েছিলেন সেখানে 'নিরাপদ' বেশী। FLAG_SECUREজন্য সিস্টেম যেমন সাম্প্রতিক-কর্ম থাম্বনেল রূপে স্ক্রিনশট।
কমন্সওয়্যার

2
দুর্দান্ত ও সহজ উত্তর! আমি ভাবছি যে কোনও ব্যক্তি প্রেরিত চিত্রগুলির স্ক্রিনশট নিতে বাধা দেওয়ার জন্য স্ন্যাপচ্যাট জাতীয় অ্যাপ্লিকেশনগুলি কেন এটি ব্যবহার করে না।
শোভিত পুরি

78

উইন্ডো ম্যানেজ.লায়আউটপ্যারামস.এফ.এল.এল.এস.সি.কিউ.আর ব্যবহার সম্পর্কে সতর্কতা অবলম্বন করুন (স্যামসাং গ্যালাক্সি এসি যেমন, জিটি-এস5830 তে যাচাই করা হয়েছে) এর ফলে দৃশ্যটি স্ক্র্যাম্বল হয়ে যাবে। দেখতে একটি স্যামসুং নির্দিষ্ট বাগের মতো। আমি নিম্নলিখিত সুপারিশ:

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

স্ক্র্যাম্বলড স্ক্রিনটি এমন দেখাচ্ছে:

স্ক্র্যাম্বলড স্ক্রিন ইমেজ

যদিও এটি আইসিএস স্যামসুং ফোনে সঠিকভাবে কাজ করছে, তাই আমি ধরে নিচ্ছি যে সমস্যাটি জিঞ্জারব্রেড ডিভাইসগুলিতে (বা আরও পুরানো) বিচ্ছিন্ন।


8
আপনি সম্পূর্ণরূপে সঠিক, আমরা এই সমস্যাটি জুড়ে এসেছি, এবং অবশ্যই অবশ্যই এটি API স্তরের জন্য যাচাই করা দরকার ছিল। প্রকৃতপক্ষে এটি পোস্ট করতে ভুলে গেছেন, তাই এটি আবার আনার জন্য ধন্যবাদ। :)
স্টিংআর 5

এটি স্যামসাং জিওতে (জিঞ্জারব্রেড) তবে ফ্রিওতেও ঠিক আছে - তাই এটি কেবল ২.৩
পিক্সেল

আমরা এই সমস্যাটিও লক্ষ্য করেছি। আপনি জিঞ্জারব্রেড ডিভাইসে এমুলেটরটিতে যাচাই করতে পারেন।
টুইডডিংটন

আমি নিশ্চিত করতে পারি যে এই সমস্যাটি স্যামসাং জিনজারব্রেড ডিভাইসে প্রদর্শিত হচ্ছে appears
এর্নির এরলিংসন

7
এমনকি নতুন অ্যান্ড্রয়েড সংস্করণগুলিতেও এফএলজি_এসইসিওর সমস্যাযুক্ত হতে পারে: অ্যান্ড্রয়েড on.৩ এ FLAG_SECURE স্ক্রিন রোটেশন অ্যানিমেশনে অ্যানিমেশন সমস্যার কারণ ঘটায়, কোড. google.com/p/android/issues/detail?id=58632 দেখুন - এটি অ্যান্ড্রয়েড ৪.৪ এ স্থির করা হয়েছে
অলিভার

13

কমন্সওয়্যার দ্বারা সরবরাহিত সমাধানটি ললিপপেও বৈধ হতে থাকে।

কেবলমাত্র একটি নোট, আপনি যদি পুরো অ্যাপ্লিকেশনটির জন্য সাম্প্রতিক তালিকায় স্ন্যাপশটগুলি না দেখতে চান, তবে প্রয়োগকৃত সমস্ত কার্যক্রমের পদ্ধতিতে পতাকাটির আগে নির্দিষ্ট করা উচিতonCreate()getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);setContentView();

অন্যথায় সাম্প্রতিক তালিকার একটি স্ন্যাপশট ব্যবহারকারীর মাধ্যমে এটি নেভিগেট করা হলে পতাকা ব্যতীত প্রথম ক্রিয়াকলাপটি দেখায়।


1
আমার অ্যাপ্লিকেশনটিতে, আমার ব্যবহারকারীর পছন্দের উপর ভিত্তি করে FLAG_SECURE সেট / সাফ করার কার্যকারিতা রয়েছে। টিকিট স্যুইচারে কিটকাট এবং কালো পর্দা দেখা যায় না হওয়া পর্যন্ত এটি দুর্দান্ত কাজ করেছে। ললিপপ-এ, ওভারভিউটি আমার অ্যাপ্লিকেশনের শেষ স্ন্যাপশটটি প্রদর্শন করে, যখন FLAG_SECURE সেট করা হয়নি (সাফ করা হয়েছে)।
আর.ভারদ্বাজ

@ আর.ভারদ্বাজ আমার ধারণা আমি সেক্ষেত্রে আমরা এত কিছু করতে পারি না, তবে আপনি ব্যবহারকারীকে পরামর্শ দিতে পারেন যে, পরিবর্তনের জন্য অ্যাপটিকে পুরোপুরি কার্যকর করার জন্য পুনরায় চালু করা দরকার ;-) এবং আপনি হয়ে গেছেন।
ডেভিডাস

1
যে কেউ স্ন্যাপশট নেওয়ার আগে একটি কাস্টম ভিউ ফুলে ফেলার উপায় খুঁজে পেয়েছিল তাই এটি কেবল একটি কালো পর্দা নয়? অনপজে উইন্ডো ম্যানেজারে আমি একটি ভিউ ফুটিয়ে তোলার চেষ্টা করেছি, তবে ততক্ষণে মনে হচ্ছে এটি অনেক দেরি হয়ে গেছে।
ব্যবহারকারী 1064249

হাই @ user1064249 আপনি কি কোনও সমাধান খুঁজে পেয়েছেন? ওএসের স্ক্রিনশটটি নেওয়ার আগে আমি লঞ্চার ভিউতে স্ফীত করতে চাই
অ্যালেক্সিসক্যানি

1

অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ডে রাখার পরে একটি স্প্ল্যাশ স্ক্রিন দিয়ে coveringেকে কোনও অ্যাপের বিষয়বস্তু আড়াল করার জন্য এখানে একটি সমাধান রয়েছে। এটি 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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.