কম্পিউটার টিউটোরিয়াল

Android ডিভাইসের স্ক্রিন প্রোগ্রাম্যাটিক্যালি অন/অফ করার পদ্ধতি

DevicePolicyManager দিয়ে স্ক্রিন লক/অনলক কন্ট্রোল

Android-এ সরাসরি স্ক্রিন অন/অফ করার পাবলিক API নেই (সিকিউরিটির কারণে)। তবে Device Administration API ব্যবহার করে ডিভাইস অ্যাডমিন হিসেবে রেজিস্টার করলে lockNow() দিয়ে স্ক্রিন লক করা যায়। স্ক্রিন "অন" করলে WakeLock বা WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON ব্যবহার করতে হয়।

দুটি কনসেপ্ট

ধাপ ১: প্রজেক্ট সেটআপ

Package: com.example.screencontrol

ধাপ ২: Device Admin Policies (res/xml/device_admin_policies.xml)

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="https://schemas.android.com/apk/res/android">
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>

ধাপ ৩: DeviceAdminReceiver (DeviceAdminReceiver.java)

package com.example.screencontrol;

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class DeviceAdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        super.onEnabled(context, intent);
        Toast.makeText(context, "ডিভাইস অ্যাডমিন সক্রিয় হয়েছে", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        super.onDisabled(context, intent);
        Toast.makeText(context, "ডিভাইস অ্যাডমিন নিষ্ক্রিয় হয়েছে", Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "নিশ্চিতভাবে নিষ্ক্রিয় করতে চান? স্ক্রিন লক ফিচার কাজ করবে না।";
    }
}

ধাপ ৪: লেআউট (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="24dp"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="স্ক্রিন কন্ট্রোল ডেমো"
        android:textSize="24sp"
        android:textStyle="bold"
        android:layout_marginBottom="32dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center">

        <Button
            android:id="@+id/btnToggleAdmin"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginEnd="8dp"
            android:text="এনাবল অ্যাডমিন"
            android:onClick="toggleAdmin"/>

        <Button
            android:id="@+id/btnLock"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginStart="8dp"
            android:text="স্ক্রিন লক করুন"
            android:onClick="lockScreen"
            android:enabled="false"
            android:backgroundTint="#F44336"
            android:textColor="#FFFFFF"/>

    </LinearLayout>

    <Button
        android:id="@+id/btnWake"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="স্ক্রিন জাগান (Wake Lock)"
        android:onClick="wakeScreen"/>

    <TextView
        android:id="@+id/tvStatus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:gravity="center"
        android:text="স্ট্যাটাস: অ্যাডমিন নিষ্ক্রিয়"
        android:textSize="14sp"
        android:textColor="#666"/>

</LinearLayout>

ধাপ ৫: MainActivity.java

package com.example.screencontrol;

import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_ENABLE_ADMIN = 1001;

    private DevicePolicyManager devicePolicyManager;
    private ComponentName adminComponent;
    private Button btnToggleAdmin, btnLock, btnWake;
    private TextView tvStatus;
    private PowerManager.WakeLock wakeLock;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnToggleAdmin = findViewById(R.id.btnToggleAdmin);
        btnLock = findViewById(R.id.btnLock);
        btnWake = findViewById(R.id.btnWake);
        tvStatus = findViewById(R.id.tvStatus);

        devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        adminComponent = new ComponentName(this, DeviceAdminReceiver.class);

        // WakeLock অর্জন (স্ক্রিন অন করার জন্য)
        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
                "ScreenControl::WakeLock"
        );

        updateUI();
    }

    private void updateUI() {
        boolean isAdminActive = devicePolicyManager.isAdminActive(adminComponent);
        btnToggleAdmin.setText(isAdminActive ? "ডিসেবল অ্যাডমিন" : "এনাবল অ্যাডমিন");
        btnLock.setEnabled(isAdminActive);
        tvStatus.setText("স্ট্যাটাস: " + (isAdminActive ? "অ্যাডমিন সক্রিয় ✅" : "অ্যাডমিন নিষ্ক্রিয় ❌"));
    }

    public void toggleAdmin(View view) {
        boolean isAdminActive = devicePolicyManager.isAdminActive(adminComponent);
        
        if (isAdminActive) {
            // ডিসেবল
            devicePolicyManager.removeActiveAdmin(adminComponent);
            updateUI();
        } else {
            // এনাবল - সেটিংস পেজে যাবে
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminComponent);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, 
                    "এই অ্যাপটি স্ক্রিন লক করার জন্য ডিভাইস অ্যাডমিন অনুমতি চায়।");
            startActivityForResult(intent, REQUEST_ENABLE_ADMIN);
        }
    }

    public void lockScreen(View view) {
        if (devicePolicyManager.isAdminActive(adminComponent)) {
            devicePolicyManager.lockNow();
            tvStatus.setText("লক কমান্ড পাঠানো হয়েছে");
        } else {
            Toast.makeText(this, "প্রথমে অ্যাডমিন এনাবল করুন", Toast.LENGTH_SHORT).show();
        }
    }

    public void wakeScreen(View view) {
        // মেথড ১: WakeLock (ডিপ্রিকেটেড নয়, কিন্তু সতর্কতা দরকার)
        if (!wakeLock.isHeld()) {
            wakeLock.acquire(10 * 1000); // ১০ সেকেন্ড ধরে রাখুন
            tvStatus.setText("WakeLock অর্জিত (১০ সেকেন্ড)");
            
            // ১০ সেকেন্ড পর আটোমেটিক রিলিজ
            new android.os.Handler().postDelayed(() -> {
                if (wakeLock.isHeld()) wakeLock.release();
            }, 10000);
        }

        // মেথড ২: Window Flags (Activity context-এ ভালো কাজ করে)
        getWindow().addFlags(
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        );
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ENABLE_ADMIN) {
            if (resultCode == Activity.RESULT_OK) {
                Toast.makeText(this, "অ্যাডমিন সক্রিয় হয়েছে", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "অ্যাডমিন এনাবল ব্যর্থ", Toast.LENGTH_SHORT).show();
            }
            updateUI();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (wakeLock != null && wakeLock.isHeld()) {
            wakeLock.release();
        }
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

ধাপ ৬: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.screencontrol">

    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        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/Theme.ScreenControl">

    <receiver
        android:name=".DeviceAdminReceiver"
        android:description="@string/app_description"
        android:label="@string/app_name"
        android:permission="android.permission.BIND_DEVICE_ADMIN"
        android:exported="true">
        <meta-data
            android:name="android.app.device_admin"
            android:resource="@xml/device_admin_policies" />
        <intent-filter>
            <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>

    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:showWhenLocked="true"
        android:turnScreenOn="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    </application>
</manifest>

গুরুত্বপূর্ণ নোট: Android 10+ (API 29+) এ পরিবর্তন

  • SCREEN_BRIGHT_WAKE_LOCK, SCREEN_DIM_WAKE_LOCK ডিপ্রিকেটেড
  • বদলে WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON বা setKeepScreenOn(true) ব্যবহার করুন Activity-এ
  • Backgraund থেকে স্ক্রিন অন করা সীমাবদ্ধ (Notification + Full Screen Intent ব্যবহার করুন)

আধুনিক বিকল্প: Foreground Service + Full Screen Intent

ব্যাকগ্রাউন্ড থেকে স্ক্রিন অন করে নোটিফিকেশন দেখানোর জন্য (যেমন কলিং অ্যাপ):

// Notification Channel with HIGH importance
NotificationChannel channel = new NotificationChannel("call_channel", "Calls", 
        NotificationManager.IMPORTANCE_HIGH);

// Full Screen Intent
Intent fullScreenIntent = new Intent(context, IncomingCallActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(
        context, 0, fullScreenIntent, PendingIntent.FLAG_IMMUTABLE);

Notification notification = new NotificationCompat.Builder(context, "call_channel")
        .setSmallIcon(R.drawable.ic_call)
        .setContentTitle("Incoming Call")
        .setFullScreenIntent(fullScreenPendingIntent, true) // লক স্ক্রিনেও দেখাবে
        .setCategory(NotificationCompat.CATEGORY_CALL)
        .build();

// Service-এ
startForeground(1, notification, FOREGROUND_SERVICE_TYPE_SPECIAL_USE);

পরীক্ষা পদ্ধতি

  1. অ্যাপ ইনস্টল → খুলুন → "এনাবল অ্যাডমিন" চাপুন
  2. সেটিংস পেজে "Activate" চাপুন
  3. "স্ক্রিন লক করুন" চাপুন → ডিভাইস লক হবে
  4. "স্ক্রিন জাগান" চাপুন → স্ক্রিন জাগবে (যদি লক না থাকে)
  5. অ্যাডমিন ডিসেবল করুন → লক বাটন ডিজেবল হবে

সাধারণ সমস্যা ও সমাধান

অ্যাকশনAPIপারমিশন/প্রি-রেকвизиসাইট
স্ক্রিন লক ( turno off + lock)DevicePolicyManager.lockNow()Device Admin activated
স্ক্রিন অন (wake up)PowerManager.WakeLock (PARTIAL/SCREEN_BRIGHT)WAKE_LOCK permission
স্ক্রিন জাগিয়ে রাখাFLAG_KEEP_SCREEN_ON / setKeepScreenOn(true)Activity/window context
সমস্যাসমাধান
lockNow() কাজ করে নাDevice Admin active কিনা চেক করুন, force-lock policy XML-এ আছে কিনা
WakeLock ক্র্যাশWAKE_LOCK permission manifest-এ, onDestroy-এ release() করুন
Admin enable ডায়ালগ আসে নাManifest-এ receiver permission="BIND_DEVICE_ADMIN" এবং meta-data সঠিক কিনা
Android 13+ তে Notification পেলও স্ক্রিন অন হয় নাFull Screen Intent + HIGH importance channel + POST_NOTIFICATIONS permission
  1. অ্যান্ড্রয়েডে ফ্ল্যাশলাইট অন-অফ করার সহজ উপায়

  2. অ্যান্ড্রয়েড এবং আইফোনে কীবোর্ড সাউন্ড বন্ধ করার পদ্ধতি

  3. অ্যান্ড্রয়েডে "OK Google" অন এবং অফ করার পদ্ধতি

  4. অ্যান্ড্রয়েডে OK Google ভয়েস অ্যাক্টিভেশন বন্ধ করুন: ধাপে ধাপে গাইড