| অ্যাকশন | 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 |
ধাপ ১: প্রজেক্ট সেটআপ
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);
পরীক্ষা পদ্ধতি
- অ্যাপ ইনস্টল → খুলুন → "এনাবল অ্যাডমিন" চাপুন
- সেটিংস পেজে "Activate" চাপুন
- "স্ক্রিন লক করুন" চাপুন → ডিভাইস লক হবে
- "স্ক্রিন জাগান" চাপুন → স্ক্রিন জাগবে (যদি লক না থাকে)
- অ্যাডমিন ডিসেবল করুন → লক বাটন ডিজেবল হবে
সাধারণ সমস্যা ও সমাধান
| সমস্যা | সমাধান |
| 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 |