Не удалось запустить действие (намерение) из onServiceConnected () из AccessibilityService - PullRequest
2 голосов
/ 11 июля 2019

Я запускаю действие с помощью onServiceConnected() метода AccessibilityService.

Я успешно запустил AccessibilityService, но не могу запустить намерение администратора устройства.

Я отлаживаюприложение, служба успешно запущена и onServiceConnected() также называется callDeviceAdmin() также выполняется без сбоев, но намерение DeviceAdmin не запускается.

public class AccessibilityEventService extends AccessibilityService {

    public static final int REQUEST_CODE_FOR_ACTIVE_DEVICE_ADMIN = 100;

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

    }

    @Override
    public void onInterrupt() {
        Log.d("TAG", "EXECUTE ON Interrupt");
    }

    @Override
    protected void onServiceConnected() {
        callDeviceAdmin();
    }


    private void callDeviceAdmin(){
        ComponentName mComponentName;
        DevicePolicyManager mDevicePolicyManager;
        mDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        mComponentName = new ComponentName(this, AdminReceiver.class);

        try{
            boolean isAdmin = mDevicePolicyManager.isAdminActive(mComponentName);
            if (!isAdmin) {
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "SaferCell wants device Administrator access");
                getApplicationContext().startActivity(intent);
            }
        } catch (Exception e) {
            Log.d("onAccessibilityEvent", e.getMessage());
            e.printStackTrace();
        }

    }
}

ОБНОВЛЕНИЕ

public class AdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.device_admin_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
        Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLockTaskModeExiting(Context context, Intent intent) {
        Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show();
    }
}

1 Ответ

0 голосов
/ 11 июля 2019

Вы также можете попробовать свой код, но я создал демо-сервис доступности, чтобы попробовать это и работал нормально.

Вы должны добавить флаг Intent, потому что вы запускаете действие вне контекста Activity, требует флаг FLAG_ACTIVITY_NEW_TASK.

 public class AccessibilityServiceDemo extends AccessibilityService {
        @Override
        public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {

        }

        @Override
        public void onInterrupt() {

        }

        @Override
        protected void onServiceConnected() {
            super.onServiceConnected();
            System.out.println("onServiceConnected");
            Intent intent = new Intent().setComponent(new ComponentName("com.android.settings", "com.android.settings.DeviceAdminSettings"));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

        }
    }
...