마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

장치관리자 활성화할 때 원하는 권한만 가져올 수 없을까요?

0 추천
public class MainActivity extends Activity {
    private final static String LOG_TAG = "DevicePolicyAdmin";
    DevicePolicyManager tDevicePolicyManager;
    ComponentName tDevicePolicyAdmin;
    private CheckBox tAdminEnabledCheckbox;
    protected static final int REQUEST_ENABLE = 1;
    protected static final int SET_PASSWORD = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_policy_admin);
        tDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        tDevicePolicyAdmin = new ComponentName(this,
                MyDevicePolicyReceiver.class);

        tAdminEnabledCheckbox = (CheckBox) findViewById(R.id.checkBox1);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (isMyDevicePolicyReceiverActive()) {
            tAdminEnabledCheckbox.setChecked(true);
        } else {
            tAdminEnabledCheckbox.setChecked(false);
        }
        tAdminEnabledCheckbox
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                            intent.putExtra(
                                    DevicePolicyManager.EXTRA_DEVICE_ADMIN, tDevicePolicyAdmin);
                            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, getString(R.string.admin_explanation));
                            startActivityForResult(intent, REQUEST_ENABLE);
                        } else {
                            tDevicePolicyManager
                                    .removeActiveAdmin(tDevicePolicyAdmin);
                        }
                    }
                });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
//        if (resultCode == RESULT_OK) {
//            switch (requestCode) {
//                case REQUEST_ENABLE:
//                    Log.v(LOG_TAG, "Enabling Policies Now");
//                    tDevicePolicyManager.setMaximumTimeToLock(
//                            tDevicePolicyAdmin, 30000L);
//                    tDevicePolicyManager.setMaximumFailedPasswordsForWipe(
//                            tDevicePolicyAdmin, 5);
//                    tDevicePolicyManager.setPasswordQuality(
//                            tDevicePolicyAdmin,
//                            DevicePolicyManager.PASSWORD_QUALITY_COMPLEX);
//                    tDevicePolicyManager.setCameraDisabled(
//                            tDevicePolicyAdmin, true);
//                    boolean isSufficient = tDevicePolicyManager
//                            .isActivePasswordSufficient();
//                    if (isSufficient) {
//                        tDevicePolicyManager.lockNow();
//                    } else {
//                        Intent setPasswordIntent = new Intent(
//                                DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
//                        startActivityForResult(setPasswordIntent, SET_PASSWORD);
//                        tDevicePolicyManager.setPasswordExpirationTimeout(
//                                tDevicePolicyAdmin, 10000L);
//                    }
//                    break;
//            }
//        }
        DevicePolicyManager t;
        t = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        t.lockNow();
    }

    private boolean isMyDevicePolicyReceiverActive() {
        return tDevicePolicyManager
                .isAdminActive(tDevicePolicyAdmin);
    }

    public static class MyDevicePolicyReceiver extends DeviceAdminReceiver {

        @Override
        public void onDisabled(Context context, Intent intent) {
            Toast.makeText(context, "Device Admin Disabled",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onEnabled(Context context, Intent intent) {
            Toast.makeText(context, "Device Admin is now enabled",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public CharSequence onDisableRequested(Context context, Intent intent) {
            CharSequence disableRequestedSeq = "Requesting to disable Device Admin";
            return disableRequestedSeq;
        }


        @Override
        public void onPasswordChanged(Context context, Intent intent) {
            Toast.makeText(context, "Device password is now changed",
                    Toast.LENGTH_SHORT).show();
            DevicePolicyManager localDPM = (DevicePolicyManager) context
                    .getSystemService(Context.DEVICE_POLICY_SERVICE);
            ComponentName localComponent = new ComponentName(context,
                    MyDevicePolicyReceiver.class);
            localDPM.setPasswordExpirationTimeout(localComponent, 0L);
        }


        @Override
        public void onPasswordExpiring(Context context, Intent intent) {
            // This would require API 11 an above
            Toast.makeText(
                    context,
                    "Device password is going to expire, please change to a new password",
                    Toast.LENGTH_LONG).show();

            DevicePolicyManager localDPM = (DevicePolicyManager) context
                    .getSystemService(Context.DEVICE_POLICY_SERVICE);
            ComponentName localComponent = new ComponentName(context,
                    MyDevicePolicyReceiver.class);
            long expr = localDPM.getPasswordExpiration(localComponent);
            long delta = expr - System.currentTimeMillis();
            boolean expired = delta < 0L;
            if (expired) {
                localDPM.setPasswordExpirationTimeout(localComponent, 10000L);
                Intent passwordChangeIntent = new Intent(
                        DevicePolicyManager.ACTION_SET_NEW_PASSWORD);
                passwordChangeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(passwordChangeIntent);
            }
        }

        @Override
        public void onPasswordFailed(Context context, Intent intent) {
            Toast.makeText(context, "", Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        public void onPasswordSucceeded(Context context, Intent intent) {
            Toast.makeText(context, "Access Granted", Toast.LENGTH_SHORT)
                    .show();
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(LOG_TAG,
                    "MyDevicePolicyReciever Received: " + intent.getAction());
            super.onReceive(context, intent);
        }
    }
}

 

 

 

핸드폰 잠금을 틀렸을 때 반응하는 앱을 만들고 있는데, 장치관리자를 활성화하면 핸드폰 잠금을 틀린 걸 확인할 수 있다는 글을 보고 위의 예제를 찾았습니다. 

 

위의 예제를 조금 수정하여 제 앱에 넣으면 끝이기는 한데 이 예제를 실행해보니 권한을 받을 때 모든 데이터 삭제 비밀번호 규칙 설정 같은 저한테 필요없는 권한까지 싹 다 받아오는 것 같더라구요. 제가 만약 사용자라면 저런 메세지가 나오면 불안해서 거절할 것 같은데 필요한 화면 잠금해제 시도 실시간 확인 권한만 받아오고 싶은데 onResume안에 정의된 onCheckChanged 부분을 어떻게 바꾸면 될 것 같은데 뭘 만져야할지 잘 모르겠습니다.

화면잠금해제 시도 실시간 권한만 받아올 순 없을까요?

익명사용자 님이 2018년 5월 1일 질문

1개의 답변

0 추천
 
채택된 답변

https://github.com/xcoda/screenLock/wiki/Developing-SreenLock-(%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0)

잘 모르지만

위 사이트 보니 recevier에 meta-data 요소로 지정하는 식으로 가능한 듯 합니다.

코딩인헬 (12,150 포인트) 님이 2018년 5월 2일 답변
...