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 в рабочем профиле?