如果要检索当前用户的所有应用程序的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
我有一个在前台模式下运行的服务,我想检测运行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) 我遇到了这个奇怪的崩溃。这似乎是 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) 我们最近在 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)
我曾尝试在各种不同的地方和论坛中搜索此内容,但还没有取得任何成果。
有人可以帮我建立AlarmManager和INTERACT_ACROSS_USERS权限之间的关系以及如何解决这个问题吗?
注意:这主要发生在运行 Android 5 及更高版本的设备上。
performance android alarmmanager android-pendingintent android-multiple-users
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 …
我试图为我在 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