如果要检索当前用户的所有应用程序的ApplicationInfo列表,则可以运行:
PackageManager pkgmanager = ctx.getPackageManager();
List<ApplicationInfo> installedApps = pkgmanager.getInstalledApplications(PackageManager.GET_META_DATA);
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一种获取每个用户而不只是当前用户的列表的方法。我正在处理的应用程序具有root权限!
据我了解,用户ID可以这样检索:
List<Integer> userIds = new ArrayList<>();
PackageManager pkgmanager = ctx.getPackageManager();
final UserManager um = (UserManager) ctx.getSystemService(Context.USER_SERVICE);
List<UserHandle> list = um.getUserProfiles();
for (UserHandle user : list) {
Matcher m = p.matcher(user.toString());
if (m.find()) {
int id = Integer.parseInt(m.group(1));
userIds.add(id);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找这样的东西:
for (int i=0; i<userIds.size(); i++) {
Integer userId = userIds.get(i)
List<ApplicationInfo> installedApps = pkgmanager.getInstalledApplicationsByUserId(userId, PackageManager.GET_META_DATA);
}
Run Code Online (Sandbox Code Playgroud)
显然getInstalledApplicationsByUserId
不存在。
起初我以为getPackagesForUid可以解决问题,但事实证明,Linux感觉和用户配置文件中的“用户”之间存在差异。通常,出于隔离目的,每个Android应用程序都在其自己的用户下运行。但是可以在同一用户下运行两个应用程序,以便它们可以轻松访问彼此的数据。getPackagesForUid
仅返回在给定用户ID下运行的所有应用程序的名称,通常是一个。除了“用户”之外,还有“用户个人资料”,这是我希望该方法所指的内容。也许我应该也编写userProfileId
而不是编写userId
代码。
编辑 …
java android android-package-managers android-multiple-users android-work-profile
我正在使用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
Run Code Online (Sandbox Code Playgroud)
工作档案日志:
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
Run Code Online (Sandbox Code Playgroud)
这是OnePlus 6的日志,但我在三星S10上也观察到了类似的logcat。客户也表示他们在 S9、S8 和某些诺基亚设备(实际上是他们测试过的所有设备)上遇到了同样的问题。
通过 Android 源搜索,我发现以下代码,生成此日志:
public boolean startDiscovery() {
if (!Utils.checkCaller()) {
Log.w(TAG, "startDiscovery() - Not allowed for non-active user"); …
Run Code Online (Sandbox Code Playgroud) 鉴于在设备上生成的自签名 CA 证书文件,我试图找出一种将其安装在工作配置文件上的方法,因为使用安装 CA 证书的传统方式android.security.KeyChain.createInstallIntent()
不再适用,无论是在个人配置文件还是工作配置文件上。
我注意到在某些设备(例如 Pixel 设备)上,没有用于在工作配置文件上安装 CA 证书的系统设置 UI(仅适用于个人配置文件),而其他设备(例如,三星 Galaxy S10+ 和 Galaxy S8+)确实提供用于在工作配置文件上安装 CA 证书的系统 UI。但由于并非所有设备制造商都提供它,因此我不能依赖它。
根据Android 11 中 Android Enterprise 更改的 Android Developers 文档,只有 DPC 应用程序或由 DPC 应用程序委派的应用程序才能以编程方式安装和撤销工作配置文件中的 CA 证书。
但并非所有 DPC 应用程序都支持此 API(存在于 Test DPC 中,但不存在于 Microsoft 的 Intune 公司门户中)。
我迷路了,有人知道一种永远有效的方法吗?
我们正在开发一个具有条形码扫描功能的 Android 应用程序。我们使用 EMDK 进行条码扫描。我们的应用程序在 Zebra 移动手持设备 (MC33) 中运行。
我们目前面临的问题是,当应用程序在工作配置文件中运行时,应用程序中没有发生条形码触发(https://support.google.com/work/android/answer/6191949?hl=en),但它是在非工作配置文件中正常工作。我们尝试解决该问题,发现以下代码
EMDKResults results = EMDKManager.GetEMDKManager(Application.Context, this);
正在返回FAILURE
并且ExtendedStatusMessage
是"Failed to access dependent component."
此后我们无法继续。请帮助我们如何解决这个问题。
注意:只有当应用程序在 Android 工作配置文件中运行时才会发生这种情况