androidandroid-manifestandroid-securityexception

Lock or turn off the screen programmatically


I want to turn off / lock the screen of my device programmatically.

For the moment, when I try :

DevicePolicyManager mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
mDPM.lockNow();

I have this error :

java.lang.SecurityException: No active admin owned by uid 10176 for policy #3

This is my AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="opteamit.com.belami" >

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.location.gps" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <application...

What is wrong ?


Solution

  • Well something with high necessity can't finished with two lines of code, lock off screen required device admin. you may follow this :

    private void lock() {
        PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        if (pm.isScreenOn()) {
            DevicePolicyManager policy = (DevicePolicyManager)
                    getSystemService(Context.DEVICE_POLICY_SERVICE);
            try {
                policy.lockNow();
            } catch (SecurityException ex) {
                Toast.makeText(
                        this, 
                        "must enable device administrator",
                        Toast.LENGTH_LONG).show();
                    ComponentName admin = new ComponentName(context, AdminReceiver.class);
                    Intent intent = new Intent(
                        DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN).putExtra(
                            DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin);
                    context.startActivity(intent);
            }           
        }
    }
    

    and AdminReceiverClass:

    public class AdminReceiver extends DeviceAdminReceiver {
        public static final String ACTION_DISABLED = "device_admin_action_disabled";
        public static final String ACTION_ENABLED = "device_admin_action_enabled";
    
        @Override
        public void onDisabled(Context context, Intent intent) {
            super.onDisabled(context, intent);
            LocalBroadcastManager.getInstance(context).sendBroadcast(
                new Intent(ACTION_DISABLED));
        }
        @Override
        public void onEnabled(Context context, Intent intent) {
            super.onEnabled(context, intent);
            LocalBroadcastManager.getInstance(context).sendBroadcast(
                new Intent(ACTION_ENABLED));
        }
    }
    

    also we need declares the security policies used in metadata so for examples with Path android:resource="@xml/device_admin_sample" :

     <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
      <uses-policies>
        <limit-password />
        <watch-login />
        <reset-password />
        <force-lock />
        <wipe-data />
        <expire-password />
        <encrypted-storage />
        <disable-camera />
      </uses-policies>
    </device-admin>
    

    in our case we just need :

    <?xml version="1.0" encoding="utf-8"?>
    <device-admin xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-policies>
            <force-lock />
        </uses-policies>
    </device-admin>`
    

    Now declare it in our manifist.xml :

    <receiver
            android:name=".AdminReceiver"
            android:label="@string/device_admin"
            android:description="@string/device_admin_description"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_sample" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>`
    

    Hope it will Help you.