স্ক্রিনশট বাধা দেওয়া (FLAG_SECURE)
WindowManager.LayoutParams.FLAG_SECURE ফ্ল্যাগ সেট করলে উইন্ডোর কন্টেন্ট স্ক্রিনশট, স্ক্রিন রেকর্ডিং, এবং রিসেন্ট অ্যাপস প্রিভিউতে দেখানো বন্ধ হয়। এটি সেনসিটিভ ডেটা (পাসওয়ার্ড, ব্যাংকিং অ্যাপ) সুরক্ষার জন্য ব্যবহার করা হয়।
উদাহরণ
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
ধাপ ২: লেআউট XML (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/parent"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/openYoutube"
android:text="Open youtube application"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
ধাপ ৩: জাভা কোড (src/MainActivity.java)
package com.example.andy.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// FLAG_SECURE সেট করুন setContentView() এর আগে
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
setContentView(R.layout.activity_main);
}
}
FLAG_SECURE-এর প্রভাব
- ❌ স্ক্রিনশট নেওয়া যায় না (কালো/ব্ল্যাংক ইমেজ)
- ❌ স্ক্রিন রেকর্ডিং ব্লক হয়
- ❌ রিসেন্ট অ্যাপস-এ প্রিভিউ ব্লার/কালো দেখায়
- ❌ কাস্টম ROM-এ সکুইন্ডশট/স্মার্ট সিলেক্ট ব্লক হয়
নির্দিষ্ট উইন্ডো/ডায়ালগের জন্য
// শুধু নির্দিষ্ট ডায়ালগের জন্য
Dialog dialog = new Dialog(this);
dialog.getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
// অ্যাক্টিভিটির onResume/onPause-এ টগল করুন
@Override
protected void onPause() {
super.onPause();
getWindow().setFlags(FLAG_SECURE, FLAG_SECURE);
}
@Override
protected void onResume() {
super.onResume();
getWindow().clearFlags(FLAG_SECURE);
}
সীমাবদ্ধতা ও বিবেচনা
- রুট করা ডিভাইসে বাইপাস করা সম্ভব
- এমুলেটরে কাজ নাও করতে পারে
- Accessibility সার্ভিসগুলো আপসেট হতে পারে
- ব্যবহারকারীর অভিজ্ঞতা বাধা দেয় (শেয়ারিং, রেকর্ডিং)
- শুধু সেনসিটিভ স্ক্রিনে (লগইন, পেমেন্ট) ব্যবহার করুন
বিকল্প: কাস্টম স্ক্রিনশট ক্যালব্যাক (API 14+)
// শুধু কলব্যাক পেতে (ব্লক করবে না)
getWindow().setCallback(new Window.Callback() {
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus) {
// অ্যাপ ফোকাস হারালো - সম্ভবত স্ক্রিনশট/রিসেন্টস
}
}
});