标签: android-multiple-users

获取所有用户的应用列表

如果要检索当前用户的所有应用程序的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

24
推荐指数
1
解决办法
579
查看次数

如何检测用户之间的切换

我有一个在前台模式下运行的服务,我想检测运行Android 4.2或更高版本的平板电脑上的用户会话之间的切换.

我可以注册任何广播接收器以获得通知吗?

我注意到,只要在锁定屏幕上选择了另一个用户会话,Google音乐就会停止音乐播放.它如何检测开关?


答案解释

感谢@CommonsWare的正确答案.我将解释一下如何检测用户开关.

首先要知道文档明确说明接收者必须通过注册Context.registerReceiver.因此,做一些事情:

UserSwitchReceiver receiver = new UserSwitchReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction( Intent.ACTION_USER_BACKGROUND );
filter.addAction( Intent.ACTION_USER_FOREGROUND );
registerReceiver( receiver, filter );
Run Code Online (Sandbox Code Playgroud)

然后在接收器中,您还可以检索用户ID.这是一个小片段:

public class UserSwitchReceiver extends BroadcastReceiver {

private static final String TAG = "UserSwitchReceiver";

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        boolean userSentBackground = intent.getAction().equals( Intent.ACTION_USER_BACKGROUND );
        boolean userSentForeground = intent.getAction().equals( Intent.ACTION_USER_FOREGROUND );
        Log.d( TAG, "Switch received. User sent background = " + userSentBackground + "; User sent foreground = …
Run Code Online (Sandbox Code Playgroud)

android android-multiple-users

18
推荐指数
1
解决办法
6844
查看次数

SecurityException:获取应用程序信息:用户 1010069 和当前进程都没有 android.permission.INTERACT_ACROSS_USERS

我遇到了这个奇怪的崩溃。这似乎是 AlarmManager.set() 造成的,但我不明白如何也不明白为什么。

堆栈跟踪:

Fatal Exception: java.lang.RuntimeException: Unable to create application com.rotem.appmanager.app.MainApplication: java.lang.SecurityException: get application info: Neither user 1010069 nor current process has android.permission.INTERACT_ACROSS_USERS.
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4560)
       at android.app.ActivityThread.access$1500(ActivityThread.java:151)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5258)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:974)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by java.lang.SecurityException: get application info: Neither user 1010069 nor current process has android.permission.INTERACT_ACROSS_USERS.
       at android.os.Parcel.readException(Parcel.java:1546)
       at android.os.Parcel.readException(Parcel.java:1499)
       at android.app.IAlarmManager$Stub$Proxy.set(IAlarmManager.java:215)
       at android.app.AlarmManager.setImpl(AlarmManager.java:409)
       at android.app.AlarmManager.set(AlarmManager.java:208)
       at com.rotem.appmanager.app.DailyAppTasksHelper.scheduleNextDailyAlarm(SourceFile:81)
Run Code Online (Sandbox Code Playgroud)

编码:

    Context context = MainApplication.getAppContext();

    Intent intent = new Intent(context, …
Run Code Online (Sandbox Code Playgroud)

android android-permissions android-multiple-users

6
推荐指数
1
解决办法
4549
查看次数

AlarmManager 与 INTERACT_ACROSS_USERS 的关系

我们最近在 Firebase 中与 Crashlytics 集成,发现我们的应用程序面临此崩溃:

Fatal Exception: java.lang.SecurityException
get application info: Neither user 1010170 nor current process has 
android.permission.INTERACT_ACROSS_USERS.
android.os.Parcel.readException (Parcel.java:1540)
android.os.Parcel.readException (Parcel.java:1493)
android.app.IAlarmManager$Stub$Proxy.set (IAlarmManager.java:214)
android.app.AlarmManager.setImpl (AlarmManager.java:414)
android.app.AlarmManager.set (AlarmManager.java:213)
Run Code Online (Sandbox Code Playgroud)

导致这种情况的代码是:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    if (pendingIntent != null) {
        AlarmManager alarmManager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+triggerAfterMillis,
                pendingIntent);
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮我建立AlarmManagerINTERACT_ACROSS_USERS权限之间的关系以及如何解决这个问题吗?

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

performance android alarmmanager android-pendingintent android-multiple-users

6
推荐指数
0
解决办法
227
查看次数

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

When I run my app from Android Studio and install it on the primary user on a device, I notice that it gets installed on the secondary user as well.

In the first place, why is this happening? The android:requiredForAllUsers flag is false by default, and in any case can only be used by system apps or pre-installed apps.

Or is it the case that this happens only for debug-mode apps installed via Android Studio?

How can I prevent this …

android android-install-apk android-multiple-users

6
推荐指数
1
解决办法
1085
查看次数

模拟器中的 Android 7.1.1 多用户支持

我试图为我在 Ubuntu 16.04 64 位上构建的Android 7.1.1 AOSP模拟器获得多用户支持。构建运行lunch aosp_x86-eng并跟随模拟器运行emulator64-x86

我尝试了这个解决方案,但没有成功:

adb shell
su
setprop fw.max_users 5
Run Code Online (Sandbox Code Playgroud)

当我擦拭状态栏时,图标第一次可见,但在释放它时消失:

截图模拟器

这里一样:

adb shell setprop fw.show_multiuserui 1  
adb shell setprop fw.max_users 4  
Run Code Online (Sandbox Code Playgroud)

我也尝试通过 adb 添加用户但没有成功。执行命令后,我使用以下命令对其进行测试:

su
pm get-max-users
Run Code Online (Sandbox Code Playgroud)

结果是:

Maximum supported users: 4
Run Code Online (Sandbox Code Playgroud)

是否有障碍或类似的东西?还是我需要编辑构建?如果我需要 root 系统,为什么属性设置为 4 个用户?为什么第一次擦除时图标显示,释放后消失?

谢谢!

android android-emulator android-multiple-users android-7.1-nougat

5
推荐指数
0
解决办法
1163
查看次数