編輯:關於Android編程
Android 2.2(API 8)開始提供了一個可管理和操作設備的類DevicePolicyManager
,通過這個類可以進行鎖屏、設置密碼、清除密碼、恢復出廠設置等操作。具體功能有:
MyDeviceAdminReceiver.java<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyDeviceAdminReceiver 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 "這是一個可選的消息,警告有關禁止用戶的請求";
}
@Override
public void onPasswordChanged(Context context, Intent intent) {
super.onPasswordChanged(context, intent);
Toast.makeText(context, "設備管理;密碼已經改變", Toast.LENGTH_SHORT).show();
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
super.onPasswordFailed(context, intent);
Toast.makeText(context, "設備管理;改變密碼失敗", Toast.LENGTH_SHORT).show();
}
@Override
public void onPasswordSucceeded(Context context, Intent intent) {
super.onPasswordSucceeded(context, intent);
Toast.makeText(context, "設備管理;改變密碼成功", Toast.LENGTH_SHORT).show();
}
}
my_device_admin.xml
AndroidManifest.xml
android:name=”.MyDeviceAdminReceiver” 自定義Receiver android:label=”@string/app_lable” 對應設備管理器中的名稱 android:description=”@string/app_description” 對應設備管理器中的描述 android:resource=”@xml/my_device_admin” 自定義權限清單
activity_main.xml
MainActivity.java
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.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MainActivity extends AppCompatActivity {
/**
* 激活組件的請求碼
*/
private static final int REQUEST_CODE_ACTIVE_COMPONENT = 1;
/**
* 設備安全管理服務,2.2之前需要通過反射技術獲取
*/
private DevicePolicyManager devicePolicyManager = null;
/**
* 對應自定義DeviceAdminReceiver的組件
*/
private ComponentName componentName = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
componentName = new ComponentName(this, MyDeviceAdminReceiver.class);
/**
* 激活設備管理器
*/
findViewById(R.id.btn_active).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
Toast.makeText(MainActivity.this, "設備管理器已激活", Toast.LENGTH_SHORT).show();
} else {
// 打備管理器的激活窗口
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
// 指定需要激活的組件
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "(激活窗口中的描述信息)");
startActivityForResult(intent, REQUEST_CODE_ACTIVE_COMPONENT);
}
}
});
/**
* 取消激活設備管理器
*/
findViewById(R.id.btn_cancel_active).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.removeActiveAdmin(componentName);
Toast.makeText(MainActivity.this, "將觸發DeviceAdminReceiver.onDisabled", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 修改鎖屏密碼
*/
findViewById(R.id.btn_change_password).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.resetPassword("1234", 0);
Toast.makeText(MainActivity.this, "若發生改變,則將觸發DeviceAdminReceiver.onPasswordChanged", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 取消鎖屏密碼
*/
findViewById(R.id.btn_cancel_password).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.resetPassword("", 0);
Toast.makeText(MainActivity.this, "若發生改變,則將觸發DeviceAdminReceiver.onPasswordChanged", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 鎖屏
*/
findViewById(R.id.btn_lock).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.lockNow();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 設置鎖屏時間
*/
findViewById(R.id.btn_lock_time).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.setMaximumTimeToLock(componentName, 5000);
Toast.makeText(MainActivity.this, "鎖屏設置將不可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 取消鎖屏時間
*/
findViewById(R.id.btn_cancel_lock_time).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
devicePolicyManager.setMaximumTimeToLock(componentName, Long.MAX_VALUE);
Toast.makeText(MainActivity.this, "鎖屏設置恢復可用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
/**
* 恢復出廠設置
*/
findViewById(R.id.btn_wipe_data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isAdminActive()) {
// 模擬器上無效,真機上慎用
// devicePolicyManager.wipeData(0);
Toast.makeText(MainActivity.this, "源碼已屏蔽,慎用", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "設備管理器未激活", Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 判斷該組件是否有系統管理員的權限(【系統設置-安全-設備管理器】中是否激活)
* @return
*/
private boolean isAdminActive() {
return devicePolicyManager.isAdminActive(componentName);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_ACTIVE_COMPONENT) {
// 激活組件的響應
if (resultCode == Activity.RESULT_CANCELED) {
Toast.makeText(this, "用戶手動取消激活", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "已觸發DeviceAdminReceiver.onEnabled", Toast.LENGTH_SHORT).show();
}
}
}
}
前言:之前使用NPOI插件編寫的導表工具,其實就是直接將數據進行序列化,解析時還需要進行反序列化,步驟比較繁復,最近看到Google的一個開源的項目protobuf,不僅
MVP模式是MVC模式在Android上的一種變體,要介紹MVP就得先介紹MVC。在MVC模式中,Activity應該屬於view這一層,而在實際開發中,它既承擔了vi
本文講述aidl的簡單使用首先我們來看綁定本地service的用法:第一步:創建接口和實體類public interface IController { publi
引言我們在做 Android 開發時,常常需要實現異步加載圖片/網頁/其他。事實上,要實現異步加載,就需要實現線程間通信,而在 Android 中結合使用 Handler