Androidデバイスマネージャのいくつかの操作と権限のオンについて

6521 ワード

これを行う目的は簡単に言えば、私たちの設備が長期にわたって日光にさらされているため、長時間の運行で設備の温度が高すぎて設備の運行を停止したからです.そこで温度センサを作製し,温度が閾値を超えるとスクリーンを閉じることで温度を下げる.なぜ直接電源を切らないのかというと、ここは主にバックグラウンドの監視が便利なためです.では、どうやってスクリーンを閉じますか?Googleは私たちにDevicePolicyManagerというサービスを提供してくれました.私たちはこのサービスを通じてスクリーンの閉鎖を実現することができます.もちろんまず何かを配置する必要があります.権限申請は必要です.
    <uses-permission android:name="android.permission.DEVICE_POWER" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    <uses-permission android:name="android.permission.USES_POLICY_FORCE_LOCK" />

次に、静的ブロードキャストを作成し、登録する必要があります.
    <receiver android:name=".ScreenOffAdminReceiver"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            intent-filter>

        receiver>

上のdevice_adminファイルの内容は以下の通りです.

<device-admin xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-policies>

        <force-lock />
    uses-policies>

device-admin>

実はここで他にも多くの権限を追加することができますが、ここでは以上の構成が完了することを免除してから、関屏コードを呼び出すことができます.
DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
mDPM.lockNow();

しかし、コードを実行すると、画面を閉じることができません.なぜですか.アプリケーションのデバイス管理権限を開く必要があるからです.このオプションは一般的にシステムが設定したセキュリティオプションのデバイスマネージャで、そこで私たちのアプリケーションをチェックする必要があります.そうすれば、画面をスムーズに閉じることができます.もちろん画面を起動するのも簡単ですが、コードは以下の通りです.
PowerManager mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock mWakeLock = mPowerManager
                    .newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
mWakeLock.acquire();
mWakeLock.release();

もちろん、もしあなたのアプリケーションが私のようにシステムアプリケーションであれば、関連コードを直接呼び出してデバイス管理権限を直接開くこともできます.コードは以下の通りです.
ComponentName componentName = new ComponentName("  ","      (  ,      )");
try {
     DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
     Method setActiveAdmin = mDPM.getClass().getDeclaredMethod("setActiveAdmin", ComponentName.class, boolean.class);
     setActiveAdmin.setAccessible(true);
     setActiveAdmin.invoke(mDPM, componentName, true);
    } catch (Exception e) {
    }

ここで反射を使用する理由は、DevicePolicyManagerのsetActiveAdminメソッドがhide apiに属するため、反射呼び出しを採用するしかありません(オペレーティングシステムがAndroid 9.0の場合、反射呼び出しシステムAPIはうまく実行できませんが、システムアプリケーションに有効かどうかはしばらく分かりません.もちろん、迂回する方法もたくさんありますが、特にこのようなpublicですがhideのapiについては)