Android Enterprise - BluetoothAdapter.startDiscovery() не запускает сканирование

Я использую BluetoothAdapter.startDiscovery() чтобы найти конкретное устройство Bluetooth (это устройство Bluetooth 2.0, поэтому я должен использовать BluetoothAdapter.startDiscovery()). У меня есть все необходимые разрешения (Bluetooth, Местоположение), и приложение работает нормально.

Но теперь мне нужно использовать это приложение под Android Enterprise (рабочий профиль). В рабочем профиле сканирование не запускается. Все ограничения в профиле отключены.
После исследования logcat я обнаружил такие строки:

Журнал нерабочего профиля:

2019-07-29 10:23:13.109 10230-10446/? D/BluetoothAdapterService: startDiscovery() uid = 10126, pid = 6328
2019-07-29 10:23:13.110 10230-10446/? D/BluetoothAdapterService: startDiscovery

Журнал рабочего профиля:

2019-07-29 10:21:26.536 10230-13473/? D/BluetoothAdapterService: startDiscovery() uid = 1010126, pid = 13390
2019-07-29 10:21:26.536 10230-13473/? W/BluetoothAdapterService: startDiscovery() - Not allowed for non-active user

Это журнал OnePlus 6, но я наблюдал аналогичный журнал также на Samsung S10. Также клиенты заявили, что у них такая же проблема на S9, S8 и на некоторых устройствах Nokia (фактически на всех устройствах, на которых они тестировали).

Выполняя поиск в источниках Android, я обнаружил следующий код, производящий этот журнал:

    public boolean startDiscovery() {
        if (!Utils.checkCaller()) {
            Log.w(TAG, "startDiscovery() - Not allowed for non-active user");
            return false;
        }
        AdapterService service = getService();
        if (service == null) return false;
        return service.startDiscovery();
    }

Какие звонки Utils.checkCaller() проверить:

public static boolean checkCaller() {
    boolean ok;
    // Get the caller's user id then clear the calling identity
    // which will be restored in the finally clause.
    int callingUser = UserHandle.getCallingUserId();
    int callingUid = Binder.getCallingUid();
    long ident = Binder.clearCallingIdentity();
    try {
        // With calling identity cleared the current user is the foreground user.
        int foregroundUser = ActivityManager.getCurrentUser();
        ok = (foregroundUser == callingUser);
        if (!ok) {
            // Always allow SystemUI/System access.
            int systemUiUid = ActivityThread.getPackageManager().getPackageUid(
                    "com.android.systemui", UserHandle.USER_OWNER);
            ok = (systemUiUid == callingUid) || (Process.SYSTEM_UID == callingUid);
        }
    } catch (Exception ex) {
        Log.e(TAG, "checkIfCallerIsSelfOrForegroundUser: Exception ex=" + ex);
        ok = false;
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
    return ok;
}

Так startDiscovery() uid = 10126 а также startDiscovery() uid = 1010126 различаются в uid, что, как мне кажется, вызвано рабочим профилем, который, как мне кажется, вызывает проверку (foregroundUser == callingUser) быть false.

Напоследок вопрос: я прав, что это ошибка? Если да - есть ли способ обойти это? Если нет - как включить классическое сканирование Bluetooth в рабочем профиле?

0 ответов

Другие вопросы по тегам