问题标签 [android-work-profile]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
426 浏览

android - Android Enterprise - BluetoothAdapter.startDiscovery() 不开始扫描

我正在使用BluetoothAdapter.startDiscovery()查找特定的蓝牙设备(它是蓝牙 2.0 设备,所以我必须使用BluetoothAdapter.startDiscovery())。我拥有所有必需的权限(蓝牙、位置),并且该应用程序运行良好。

但是现在我必须在 Android Enterprise (Work Profile) 下使用这个应用程序。在工作配置文件下,它不会开始扫描。配置文件中的所有限制均已禁用。
在调查 logcat 后,我​​发现了这样的行:

非工作资料日志:

工作资料日志:

这是来自 OnePlus 6 的日志,但我在三星 S10 上也观察到了类似的 logcat。客户还表示,他们在 S9、S8 和某些诺基亚设备(实际上是他们测试过的所有设备)上遇到了同样的问题。

通过 Android 资源搜索,我发现了以下代码,产生了这个日志:

哪些电话Utils.checkCaller()要检查:

所以startDiscovery() uid = 10126startDiscovery() uid = 1010126不同uid,我认为这是由工作资料引起的,我认为这会导致支票(foregroundUser == callingUser)false.

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

0 投票
4 回答
2581 浏览

java - 获取所有用户的应用列表

如果我想检索当前用户的所有应用程序的 ApplicationInfo 列表,我可以运行:

但我正在寻找一种方法来为每个用户获取这些列表,而不仅仅是当前用户。顺便说一句,我正在开发的应用程序具有 root 权限!

据我了解,可以像这样检索用户 ID:

现在我正在寻找这样的东西:

显然getInstalledApplicationsByUserId是不存在的。

起初我认为getPackagesForUid可以解决问题,但事实证明,Linux 意义上的“用户”和用户配置文件之间存在差异。通常,出于隔离目的,每个 Android 应用程序都在其自己的用户下运行。但是可以在同一用户下运行两个应用程序,以便他们可以轻松地访问彼此的数据。getPackagesForUid仅返回在给定用户 id 下运行的所有应用程序的名称,通常正好是一个。除了“用户”之外,还有“用户配置文件”,这是我希望该方法所指的内容。也许我也应该写userProfileId而不是写userId在我的代码中。

编辑:使用 adb shell,我可以像这样检索应用程序 ID:

但那是 Bash 而不是 Java ......

Edit2:如果我错了,请纠正我(这是我第一次用 Java 编写代码),但似乎没有 Java API 可以做到这一点。因此,唯一的方法是使用 shell。所以这就是我想出的:

但我不知道这是否接近实际可行的东西。除此之外,我只获取每个用户配置文件的包 ID(“com.whatsapp”等),但我想获取ApplicationInfo列表,就像getInstalledApplications返回它一样。我只是想不出一个好的方法来做到这一点。也许可以加载包清单,然后以某种方式基于它们创建 ApplicationInfo 实例?

Edit3:我想我找到了可执行文件的源代码pm

奇怪的是,我在其中找不到任何提及--user国旗的内容。

代码中最相关的部分是:

getInstalledPackages方法简单地调用mPm.getInstalledPackagesthen:

这给我留下了比以前更多的问题。首先,我想知道我是否不能只导入com.android.commands.pm课程。其次,我想知道如何告诉它返回特定用户配置文件的包,或者这是否是正确的源代码。最后我想知道我是否需要root权限才能使用它。毕竟,if (Process.myUid() != ROOT_UID)检查只针对runRemoveProfile,runCreateProfile和执行runListProfiles

Edit4:我找不到package服务的源代码。我只能找到这个文件:/data/system/packages.xml. 它包含所有包的一些基本包信息(对于所有用户配置文件),但它既不包含实际的应用程序名称,也不包含有关它们所属的用户配置文件的信息。

Edit5:我想我找到了包服务源代码。我认为这个方法很重要:

不幸的是,我只是不明白代码。对我来说,这些包裹似乎来自mSettings.mPackages. 该变量在代码注释中解释如下:

{@link #mPackages} 用于保护所有内存中解析的包详细信息和其他相关状态。这是一个细粒度的锁,只能暂时持有,因为它是系统中竞争最激烈的锁之一。

Edit6:我刚刚在该文件中发现了另一种更有趣的方法:

我不知道 ParceledListSlice 是什么,但它说<ApplicationInfo>我假设这真的很接近我想要的List<ApplicationInfo>格式。但是,我仍然完全不知道如何访问该功能。

0 投票
0 回答
409 浏览

android - Android 工作简介:android.intent.action.DATA_SMS_RECEIVED 从未被解雇

我正在开发一个通过 SMS(实际上是数据 SMS)与后端通信的应用程序。

发送和接收 SMS 在常规设置中完美运行,但是我们的一位用户启用了 Android工作配置文件,并且该应用程序安装在工作配置文件中。

现在应用程序没有收到 DATA_SMS_RECEIVED 意图。我试图找到有关此的任何文档,但没有找到。为了使 DATA_SMS_RECEIVED 在工作资料上工作,我需要做些什么特别的事情吗?

这是相关的清单声明:

这是来自 BroadcastReceiver 的相关代码

请注意:这是一个内部应用程序,Android 的新短信限制不适用。

0 投票
0 回答
788 浏览

android - 当应用程序在工作资料中运行时如何从个人资料中选择图像

我的应用程序正在工作配置文件中运行。从应用程序中,我打算打开运行良好的 Android 画廊应用程序。它向我显示了可以处理工作配置文件中意图的应用程序列表。在那里,我还可以选择“切换到个人资料”。当我选择个人资料时,它会显示可以处理个人资料中意图的应用程序列表。我选择一个应用程序并选择图像。现在在 onActivityResult 中,我得到了具有这样的权限和路径的 Uri -

这里0是个人资料的用户信息。我使用以下代码检查它是否是文档 URI,但它总是返回 false -

从开发人员文档中,我找到了此链接https://developer.android.com/reference/android/net/Uri#getEncodedAuthority() 但它没有关于如何使用这些类型的权限解析和访问文件的文档。

可以使用工作配置文件生成此场景。有人可以帮我吗?

0 投票
0 回答
560 浏览

playback - 私有 Android 应用程序未显示在托管 Android Google Play 中

我订阅了 G Suite 基本版。对于订阅的管理员用户,我按照相当简单的步骤通过进入: https ://admin.google.com/ac/home 发布私有 Android 应用程序 从这里,在

Devices (Device management) -> App Management -> Manage Apps for Android devices -> button "MANAGE WHITELISTED APPS" -> button (+) -> in the iframe, from left menu, "Private Apps" ...and so on.

我还将应用程序添加到集合中。在管理 Google 控制台中,我还启用了

Devices (Device management) -> Advanced Settings -> Other Google Services -> Google Play private apps:

TRUE :允许用户访问 Google Play 私有应用。

TRUE :允许用户发布和更新 Google Play 私有应用。

然后,我通过添加 G Suite 帐户来注册设备:这会触发(成功)创建工作配置文件,在个人配置文件旁边(我将使用 BYOD 用例)。在安装过程中,就在 Android 要求您提供解锁 pin/schema 之后,我什至会看到所有“工作应用程序”的列表,并且我确实看到了 Android 声称即将安装的应用程序.. ...但它适用于上次。Work Profile 向导一结束,我就可以在 UI 中找到(我使用的是 Andoid 9)两个选项卡:“个人”和“工作”。那里没有私人应用程序的踪迹:尽管我在 Google 管理员中标记了它,但它并没有自动安装。此外,如果我从工作配置文件(设置 owrk 配置文件后出现的“标记”版本)在 Android 中启动托管 Google Play 应用程序,我只能看到基本的公共应用程序(GDrive、GMail、

还有其他标志我必须在某处检查吗?这可能是由于我的“G Suite Basic”而不是“Business”或“Enterprise”造成的吗?

非常感谢

0 投票
1 回答
397 浏览

android - 如何以编程方式禁用同步适配器或提供程序作为设备管理员?

我需要编写一个可以防止在工作资料中同步联系人的应用程序。在 Android 9 之前,我只是禁用了该软件包com.google.android.syncadapters.contacts,仅此而已。

不幸的是,自 Android 10 以来,Play 服务负责从 Google 帐户同步联系人。但我不想禁用com.google.android.gms工作配置文件中的包,因为它有更多的副作用。

因此,我目前正在寻找一种方法或 API,以禁用另一个应用程序的特定组件作为设备管理员或工作资料的所有者。

谢谢和问候,大卫

0 投票
1 回答
460 浏览

android - 使用 iOS 等浏览器从 Android 获取 IMEI

在 iOS 中,在设备中安装配置文件后,可以使用 Safari 获取 IMEI。例如:

从 Android 10 不可能以编程方式获取 IMEI。我想知道是否可以通过类似于 iOS 的方法从 Android 获取它。

你有什么想法?非常感谢!

0 投票
1 回答
871 浏览

android - Android 工作资料应用程序:如何推送和拉取数据

我安装了工作配置文件应用程序,并且可以使用getExternalFilesDir("logs")它以编程方式访问数据的位置,从而导致存储位置为/storage/emulated/11/Android/data/com.example.workprofile/files/logs.

我想知道如何将数据推送到日志文件夹并使用adb.

0 投票
1 回答
304 浏览

android - 无法在工作配置文件模式下以编程方式在 android 7 上安装 apk(未知来源)

我正在尝试以“工作配置文件”模式(BYOD)以编程方式安装 apk。但是有一个我无法解决的问题:无法在 android 版本 7.0(24) 和 7.1(25) 中安装 apk。将出现一个带有此消息的弹出对话框:

您的管理员不允许安装从未知来源获取的应用

瞧我怎么做:

在清单中:

和 file_provider_paths.xml :

0 投票
1 回答
155 浏览

android - 使用 Google Play 发布私有 android 应用

这可能不是重复。我试图找到解决方案。但是我找不到任何东西。我的目标是在 Google Play 上发布一个私有应用程序。我所做的是,

  1. 注册企业用户https://enterprise.google.com/android/experience
  2. 添加用户。
  3. 获取组织 ID
  4. 使用“定价和分发”中的组织 ID 从 Google Play 发布应用程序(因为它是同一用户(开发人员和企业),我只需要选择该公司)。
  5. 该应用程序已发布,并显示在企业帐户的应用程序列表中

但问题是,当我从设备转到工作资料时。该应用不在工作资料中的应用列表中。

** 该应用程序于一天前发布。

** 该应用程序已在 4 小时前在企业帐户中启用。

** 该应用程序只是一个具有空白活动的示例应用程序。