Android 장치 관리자의 일부 작업 및 사용 권한 설정 정보

이 목적을 간단명료하게 말하자면, 우리의 설비가 장기간 햇빛에 노출되어 장시간의 운행으로 인해 설비의 온도가 너무 높아서 설비의 운행이 중단되었다.그래서 우리는 온도가 한도값보다 높을 때 화면을 닫아서 온도를 낮추는 온도 센서를 만들었다.왜 직접 전원을 끄지 않는지는 주로 백그라운드 모니터링의 편의를 위해서다.그럼 화면을 어떻게 끄죠?구글은 이 서비스를 통해 화면을 닫을 수 있는 DevicePolicy Manager라는 서비스를 제공합니다.물론 우선 우리는 몇 가지 물건을 배치해야 하는데, 권한 신청은 틀림없이 필요한 것이다
    <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>

위의 deviceadmin 파일의 내용은 다음과 같습니다.

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

여기에서 반사를 사용하는 이유는 DevicePolicy Manager의 setactive Admin 방법이 hideapi에 속하기 때문입니다.따라서 우리는 반사 호출을 취할 수밖에 없다. (만약 당신의 운영체제가 안드로이드 9.0이라면 반사 호출 시스템 API는 순조롭게 실행될 수 없을 것이다. 그러나 이 메커니즘이 시스템에 적용되는지 당분간 알 수 없다. 물론 돌아가는 방식도 매우 많다. 특히 이런 public이지만 hide의api에 대해서도)

좋은 웹페이지 즐겨찾기