Android Device Policy Manager не работает
Я пытаюсь сделать простое приложение, которое будет блокировать экран устройства при входящем звонке. Для этого я сделал администратора пользовательского устройства с помощью этого урока. Но когда я нажимаю кнопку "Включить" в моем приложении, действие диспетчера политики устройств не открывается вообще! И я получаю вывод в окне logcat, который говорит, что мой ComponentName
является недействительным. Тем не менее, я не нахожу никаких проблем в моем проекте, что так никогда!
MainActivity.java
package com.swap.delay;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
DevicePolicyManager devicePolicyManager;
ActivityManager activityManager;
ComponentName componentName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
componentName = new ComponentName(this, LockAdmin.class);
}
public void OnClickActivate(View view) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Lock Admin by Swap");
startActivityForResult(intent, 1);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
Toast.makeText(getBaseContext(), "Lock Admin by Swap added successfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getBaseContext(), "Failed!", Toast.LENGTH_SHORT).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
}
LockAdmin.java
package com.swap.delay;
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;
public class LockAdmin extends DeviceAdminReceiver{
static SharedPreferences getSamplePreferences(Context context) {
return context.getSharedPreferences(DeviceAdminReceiver.class.getName(), 0);
}
static String PREF_PASSWORD_QUALITY = "password_quality";
static String PREF_PASSWORD_LENGTH = "password_length";
static String PREF_MAX_FAILED_PW = "max_failed_pw";
void showToast(Context context, CharSequence message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
@Override
public void onEnabled(Context context, Intent intent) {
showToast(context, "Lock Admin Enabled");
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
showToast(context, "Lock Admin: Wrong Password");
}
@Override
public void onPasswordSucceeded(Context context, Intent intent) {
//showToast(context, "Sample Device Admin: pw succeeded");
}
}
policies.xml
<device-admin xmlns:android="http://schemas.android.com/apk/res/auto">
<uses-policies>
<force-lock>
</force-lock>
</uses-policies>
</device-admin>
Получатель (добавлен в manifest.xml)
<receiver android:name=".LockAdmin" 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">
</action></intent-filter>
</meta-data></receiver>
Выход Logcat -
08-25 12:52:40.103 652-1906/? I/ActivityManager﹕ START u0 {act=android.app.action.ADD_DEVICE_ADMIN cmp=com.android.settings/.DeviceAdminAdd (has extras)} from uid 10172 on display 0
08-25 12:52:40.162 652-1070/? I/ActivityManager﹕ Start proc com.android.settings for activity com.android.settings/.DeviceAdminAdd: pid=6313 uid=1000 gids={41000, 9997, 3002, 3001, 3003, 1028, 1015, 1000, 1021, 3004, 3005, 3009, 1023, 1010, 1007} abi=arm64-v8a
08-25 12:52:40.332 6313-6313/? W/DeviceAdminAdd﹕ Request to add invalid device admin: ComponentInfo{com.swap.delay/com.swap.delay.LockAdmin}
PS - Я тестировал приложение на двух разных устройствах на основе AOSP KitKat(4.4.2) и еще одного CyanogenOS 12.0(5.0.2), оно не работало ни на одном из них.