Giới thiệu
Hướng dẫn khóa màn hình thiết bị Android lập trình qua Device Administration API. Yêu cầu người dùng cấp quyền Device Admin cho ứng dụng.
Các bước thực hiện
Bước 1: Tạo dự án mới
Tạo project Android Studio.
Bước 2: Giao diện với 2 nút (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_margin="16dp"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal">
<Button
android:id="@+id/btnEnable"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="enablePhone"
android:text="Kích hoạt" />
<Button
android:id="@+id/btnLock"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="lockPhone"
android:text="Khóa màn hình" />
</LinearLayout>
</RelativeLayout>
Bước 3: Chính sách Device Admin (res/xml/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>
Bước 4: Broadcast Receiver xử lý sự kiện Admin (src/DeviceAdmin.java)
package app.tutorialspoint.com.sample;
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class DeviceAdmin extends DeviceAdminReceiver {
@Override
public void onEnabled(Context context, Intent intent) {
super.onEnabled(context, intent);
Toast.makeText(context, "Đã kích hoạt Device Admin", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisabled(Context context, Intent intent) {
super.onDisabled(context, intent);
Toast.makeText(context, "Đã vô hiệu hóa Device Admin", Toast.LENGTH_SHORT).show();
}
}
Bước 5: MainActivity xử lý logic (src/MainActivity.java)
package app.tutorialspoint.com.sample;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static final int RESULT_ENABLE = 1;
DevicePolicyManager devicePolicyManager;
ComponentName compName;
Button btnEnable, btnLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnEnable = findViewById(R.id.btnEnable);
btnLock = findViewById(R.id.btnLock);
devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
compName = new ComponentName(this, DeviceAdmin.class);
boolean active = devicePolicyManager.isAdminActive(compName);
updateUI(active);
}
public void enablePhone(View view) {
boolean active = devicePolicyManager.isAdminActive(compName);
if (active) {
devicePolicyManager.removeActiveAdmin(compName);
updateUI(false);
} else {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, compName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Bạn cần kích hoạt ứng dụng để khóa màn hình!");
startActivityForResult(intent, RESULT_ENABLE);
}
}
public void lockPhone(View view) {
devicePolicyManager.lockNow();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_ENABLE) {
if (resultCode == Activity.RESULT_OK) {
updateUI(true);
} else {
Toast.makeText(getApplicationContext(), "Kích hoạt thất bại!", Toast.LENGTH_SHORT).show();
}
}
}
private void updateUI(boolean active) {
if (active) {
btnEnable.setText("Vô hiệu hóa");
btnLock.setVisibility(View.VISIBLE);
} else {
btnEnable.setText("Kích hoạt");
btnLock.setVisibility(View.GONE);
}
}
}
Bước 6: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.tutorialspoint.com.sample">
<uses-permission android:name="android.permission.CALL_PHONE" />
<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/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".DeviceAdmin"
android:description="@string/app_description"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/policies" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị thật (không chạy được trên emulator nếu không bật Device Admin), nhấn Run. Nhấn "Kích hoạt" → chấp nhận yêu cầu Device Admin → nhấn "Khóa màn hình" để khóa thiết bị ngay lập tức.

Lưu ý quan trọng
- Cần quyền
BIND_DEVICE_ADMINvà khai báo receiver trong manifest - Người dùng phải đồng ý cấp quyền Device Admin qua hộp thoại hệ thống
- Từ Android 10+, một số API Device Admin bị hạn chế, cân nhắc dùng
DevicePolicyManager.lockNow()kết hợp với các API quản trị mới - Gỡ ứng dụng: Vào Cài đặt → Bảo mật → Quản trị thiết bị → Bỏ chọn app → Gỡ cài đặt