6

我正在使用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 = 10126startDiscovery() uid = 1010126不同uid,我认为这是由工作资料引起的,我认为这会导致支票(foregroundUser == callingUser)false.

最后的问题是:我说它是一个错误是对的吗?如果是 - 有没有办法解决它?如果否 - 如何在工作资料中启用蓝牙经典扫描?

4

0 回答 0