问题标签 [android-multiple-users]

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 投票
1 回答
8353 浏览

android - 如何在工作资料应用程序中访问 SD 卡中的个人文件?

根据谷歌的介绍https://developer.android.com/work/managed-profiles.html,工作配置文件应用程序无法访问 SD 卡中的个人文件。但是发送后点击“个性”可以看到DocumentsUI(系统提供的应用程序)中的所有文件Intent(ACTION_GET_CONTENT),而且文件名、大小和日期都显示出来了,看起来文件是可读的。但是当我们使用onActivityResult我得到的uri时,FileNotException (EACCES: permission denied)如果我做读取操作(READ_EXTERNAL_STORAGE权限已经被授予)。我们可以从工作资料应用程序访问这些个人文件吗?如果是,我该如何读写它们?

提前致谢!

参考问题@Access SD card data from android for work app,答案是真的吗?

0 投票
0 回答
235 浏览

android - AlarmManager 和 INTERACT_ACROSS_USERS 的关系

我们最近在 Firebase 中集成了 Crashlytics,发现我们的应用正面临这样的崩溃:

导致这种情况的代码是:

我曾尝试在各种不同的地方和论坛中搜索此内容,但还没有取得任何成果。

谁能帮我建立AlarmManagerINTERACT_ACROSS_USERS权限之间的关系以及如何解决这个问题?

注意:这主要发生在运行 Android 5 及更高版本的设备上。

0 投票
0 回答
450 浏览

android - 当所有者用户安装我的应用程序时,如何为所有设备用户安装我的应用程序?

我想知道如何使应用程序及其服务对所有设备用户可用,包括访客模式和安装后添加的用户。Kiosk 模式和 root 设备不是一个选项。我的应用程序以管理员权限运行。APK 由用户直接安装,而不是通过 Play 商店安装。它有 3 个服务在后台运行。它适用于棒棒糖。是否有可能做到这一点?

0 投票
2 回答
67 浏览

android - 使用 SQLiteOpenHelper 和 ContentProvider 为每个应用程序用户使用单独的数据库

我的应用程序使用 SQLite DB,用 aSQLiteOpenHelper和 a包装ContentProvider。我在应用程序中添加了登录功能,现在我希望每个用户只能看到自己的数据。我认为实现这一点的方法是让应用程序为登录到应用程序的每个用户创建一个单独的数据库,并在数据库的文件名中使用用户的 ID。

我有这个ContentProvider

我有这个SQLiteOpenHelper

哪个有这个构造函数:

到目前为止,该应用程序不能拥有多个用户,因此它只有一个数据库。所以DB_NAME总是相同的字符串。我现在尝试这样设置:

(如您所见,我正在使用Firebase身份验证)

但这导致了崩溃,因为显然内容提供者是在应用程序启动时创建的,在用户进行身份验证之前。(user空值也是如此。是的,我应该user在尝试调用之前检查它是否为空值getUid()。但这不会使这件事起作用)

所以这似乎不是正确的方法。如何根据签名用户使用不同的数据库?我可以在用户通过身份验证后首先创建内容提供者吗?

我也可以将所有内容保存在一个数据库中并添加一UID列。但这是否能很好地保护不同用户的数据?此外,这将意味着更多的代码更改。

0 投票
3 回答
539 浏览

android - 有没有办法在同一个安卓手机上安装我的应用程序的调试版本和我的应用程序的谷歌播放商店版本?

有没有办法在同一个安卓手机上安装我的应用程序的调试版本和我的应用程序谷歌播放商店版本?我尝试在我的 android 上设置多个用户,但是当来自另一个用户而不是所有者用户(安装了我的应用程序的调试版本)时,我尝试从我收到的 google play 商店安装应用程序:

您无法安装此应用,因为其他用户已经安装了不兼容的版本

0 投票
2 回答
745 浏览

android - 未找到处理 Intent { act=android.app.action.ADD_DEVICE_ADMIN (has extras) } 的 Activity

我正在尝试启用设备管理,以便可以在 Android 9 中创建辅助用户。

首先是使用 ACTION_ADD_DEVICE_ADMIN 发送一个意图,如下所示:

必须先在 manifest.xml 中使用适当的意图过滤器定义 deviceAdminReceiver:

还定义了 deviceAdminReceiver 类:

但后来我得到了错误:

03-28 16:44:54.573 7173 7173 E AndroidRuntime: java.lang.RuntimeException: 无法恢复活动 {com.sensory.trulysecureexample/com.sensory.trulysecure.custom.CreateRenaultUser}: android.content.ActivityNotFoundException: 找不到活动处理 Intent { act=android.app.action.ADD_DEVICE_ADMIN(有附加功能)} 03-28 16:44:54.573 7173 7173 E AndroidRuntime:在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3822) 03-28 16 :44:54.573 7173 7173 E AndroidRuntime: 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3854) 03-28 16:44:54.573 7173 7173 E AndroidRuntime: 在 android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityIte

我的 Android 应用程序有几个活动和片段,但如果我理解得很好,这应该是一个 Android 系统活动。我的设备在使用“adb shell pm list features”列出时还有“feature:android.software.device_admin”我的设备是否有任何限制阻止处理 ACTION_ADD_DEVICE_ADMIN 意图?

注意:我遵循了这个 Google Android 指南https://developer.android.com/guide/topics/admin/device-admin.html

谢谢

0 投票
2 回答
454 浏览

android - 如何在 android 中创建多个用户注册和登录活动?

我已经使用共享偏好在 android 中进行了注册和登录活动。用户能够注册并成功登录。但我的问题是当新用户注册时,它会删除以前用户的注册详细信息。

这是我的注册页面:

我只想知道如何使用共享首选项文件注册多个用户?

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 投票
3 回答
1298 浏览

android - 防止 Android 应用安装在多个用户上

当我从 Android Studio 运行我的应用程序并将其安装在设备上的主要用户上时,我注意到它也安装在次要用户上。

首先,为什么会发生这种情况?默认情况下,该android:requiredForAllUsers标志false只能由系统应用程序或预安装的应用程序使用。

还是只有通过 Android Studio 安装的调试模式应用才会出现这种情况?

我怎样才能防止这种情况发生?

对于我的应用来说,仅安装在一个用户身上是至关重要的。我已经阅读了以下文件:

支持多用户

管理多个用户

这些文档都没有解释安装过程是否以及如何受到多用户功能的影响。

肯定有一些清单或构建设置允许或阻止在多个用户上安装。为什么不容易找到?为什么这个问题在 SO 上不常见?

0 投票
0 回答
639 浏览

android - Android multi-user: get current user info

Strangely there isn't a question on SO regarding this topic. At least I couldn't find one.

Like Windows & Linux, Android too allows us to have multiple user accounts on the same device/computer:

android multi users

Each user is the FIRST (or primary) Google account with which the device/user partition was activated. Hence, one way to get the name/email associated with this user is through Google Sign-In:

google sign in pick account dialog

My question is, is there a way to get at least the name (if not the email) of the device user? Without using Google Sign-In, which requires both the Play Services library and the GET_ACCOUNTS permission?

There should be some Android API or Provider that tells us the name of the current device user. I've already looked at the following documents:

Supporting Multiple Users

Manage multiple users

AccountManager

.... and I couldn't find anything there.

Does anyone know of a way to get the name/email of the primary Google account on the current user/partition? WITHOUT Google Sign-In, which requires Play Services? Is there some Java/Android API that gives us the account details for the current user?

Related:

1. How to get active account Id in android multi user

2. How Gmail does it

3. Getting it without the GET_ACCOUNTS permission

4. Getting Android owner's email address nicely