我正在使用BluetoothAdapter.startDiscovery()
查找特定的蓝牙设备(它是蓝牙 2.0 设备,所以我必须使用BluetoothAdapter.startDiscovery()
)。我拥有所有必需的权限(蓝牙、位置),并且该应用程序运行良好。
但是现在我必须在 Android Enterprise (Work Profile) 下使用这个应用程序。在工作配置文件下,它不会开始扫描。配置文件中的所有限制均已禁用。
在调查 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 的日志,但我在三星 S10 上也观察到了类似的 logcat。客户还表示,他们在 S9、S8 和某些诺基亚设备(实际上是他们测试过的所有设备)上遇到了同样的问题。
通过 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
.
最后的问题是:我说它是一个错误是对的吗?如果是 - 有没有办法解决它?如果否 - 如何在工作资料中启用蓝牙经典扫描?