2017-06-21 3 views
0

Je veux désactiver/verrouiller l'écran de mon appareil par programme.Verrouiller ou éteindre l'écran par programme

Pour le moment, lorsque je tente:

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

J'ai cette erreur:

java.lang.SecurityException: Aucun administrateur actif détenu par uid 10176 pour la politique n ° 3

Ceci est mon 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... 

Qu'est-ce qui ne va pas?

+1

affichez votre fichier manifest.xml. – Ibrahim

+0

fait! Voulez-vous voir uniquement les autorisations? –

Répondre

2

Bien quelque chose avec une nécessité élevée ne peut pas terminé avec deux lignes de code, verrouiller écran requis device admin. vous pouvez suivre ceci:

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); 
     }   
    } 
} 

et 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)); 
    } 
} 

aussi nous avons besoin déclare les politiques de sécurité utilisées dans les métadonnées ainsi pour des exemples avec Android Path: 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> 

dans notre cas, nous avons juste besoin:

<?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>` 

Maintenant déclarer dans notre 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>` 

Espoir il vous aidera.

+0

Merci mais j'ai ** android.util.AndroidRuntimeException: L'appel de startActivity() depuis l'extérieur d'un contexte d'activité nécessite l'indicateur FLAG_ACTIVITY_NEW_TASK. Est-ce vraiment ce que vous voulez? ** (Je suis dans un 'Service') –

+0

@ Jéwôm 'quelle est cette nouvelle exception? quand est-il arrivé? – Ibrahim

+0

Cela arrive dans la ligne startActivity (intention) –