如何在安卓系统中通过编程实现锁屏功能

6
如何通过编程锁定我的Android手机? 我尝试了此示例。但是当我点击启用按钮时,该活动会弹出几毫秒,然后自动关闭。
日志未显示任何错误,只有这个日志。
 Log.i("DeviceAdminSample", "Admin enable FAILED!");

请问如何锁定安卓屏幕(类似于尝试图案解锁太多次后的锁定状态)

非常感谢您的帮助。

2个回答

24

你需要将你的应用程序设置为管理员权限,在这里阅读一些内容

创建一个新的空项目,并创建一个名为MyAdminReceiver的类,继承DeviceAdminReceiver,如下所示

import android.app.admin.DeviceAdminReceiver;

public class MyAdminReceiver extends DeviceAdminReceiver{

}
创建一个名为xml的新文件夹,并为您的管理员权限创建一个.xml文件,名称为admin.xml,并添加策略,在您的情况下,是锁定屏幕。
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
    <uses-policies>
        <force-lock />
    </uses-policies>
</device-admin>
在您的清单文件中,在Application标签下添加一个接收器。
<receiver
    android:name="MyAdminReceiver"
    android:permission="android.permission.BIND_DEVICE_ADMIN">
    <meta-data
        android:name="android.app.device_admin"
        android:resource="@xml/admin"/>

    <intent-filter>
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
    </intent-filter>
</receiver>

在你的 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.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private static final int ADMIN_INTENT = 15;
    private static final String description = "Some Description About Your Admin";
    private DevicePolicyManager mDevicePolicyManager; 
    private ComponentName mComponentName;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDevicePolicyManager = (DevicePolicyManager)getSystemService(  
                  Context.DEVICE_POLICY_SERVICE);  
        mComponentName = new ComponentName(this, MyAdminReceiver.class);  
        Button btnEnableAdmin = (Button) findViewById(R.id.btnEnableAdmin);
        Button btnDisableAdmin = (Button) findViewById(R.id.btnDisableAdmin);
        Button btnLock = (Button) findViewById(R.id.btnLock);
        btnEnableAdmin.setOnClickListener(this);
        btnDisableAdmin.setOnClickListener(this);
        btnLock.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btnEnableAdmin:
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,description);
            startActivityForResult(intent, ADMIN_INTENT);
        break;

        case R.id.btnDisableAdmin:
            mDevicePolicyManager.removeActiveAdmin(mComponentName);  
            Toast.makeText(getApplicationContext(), "Admin registration removed", Toast.LENGTH_SHORT).show();
        break;

        case R.id.btnLock:
             boolean isAdmin = mDevicePolicyManager.isAdminActive(mComponentName);  
             if (isAdmin) {  
                 mDevicePolicyManager.lockNow();  
             }else{
                 Toast.makeText(getApplicationContext(), "Not Registered as admin", Toast.LENGTH_SHORT).show();
             }
        break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == ADMIN_INTENT) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(getApplicationContext(), "Registered As Admin", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(getApplicationContext(), "Failed to register as Admin", Toast.LENGTH_SHORT).show();
            }
        }
    }

}

注意:如果您尝试从非Activity子类调用Admin设备的Intent,可能会出现错误以使用Intent.FLAG_ACTIVITY_NEW_TASK,但如果您使用它,则您的窗口可能无法像在您的情况下弹出,请尝试仅从活动的子类中打开它。

此外,除非应用程序已取消注册为管理员,否则无法卸载应用程序。


0
但是当我点击启用按钮时,活动会弹出几毫秒,然后自动关闭。
在示例中显示的代码将在单击时打开设置应用程序。
有人能告诉我如何锁定Android屏幕吗?
您可以使用您链接到的代码。 这是我的示例应用程序 显示相同的基本内容。
具体来说:
- 您需要在清单中拥有一个已设置为设备管理组件的广播接收器 - 用户必须将您的应用程序激活为设备管理员 - 然后在 DevicePolicyManager 上调用 lockNow() 这是设备管理员API的开发人员文档

谢谢,这对于锁屏起作用了,现在我该如何强制执行<wipe-data>,<watch-login>和<encrypted-storage />?另外,您能解释一下<limit-password>和<reset-password>是什么吗? - user2726456
我能够执行<wipe-data>,但我有一个最后的问题。加密存储对我的存储有效还是所有存储都有效?我的存储指的是我保存的数据或创建的首选项。 - user2726456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接