Как отличить первичные и вторичные профили в Android?
Я пытаюсь отключить компонент во время приложения OTA на моем дополнительном профиле. Я пишу приемник для отключения компонента путем захвата "android.intent.action.MY_PACKAGE_REPLACED". Добавление моего изменения AndroidManifest.xml здесь,
<receiver android:name=".receivers.OTAUpdateReceiver"android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
наряду с добавлением этих разрешений,
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
И вот мой код получателя,
private static final int PRIMARY_USER_ID = 0;
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Entering here into ota update receiver");
packageManager = context.getPackageManager();
myComponent = new ComponentName(MY_PKG, MY_CLASS);
if (mPackageManager.hasSystemFeature("com.abc.xyz") && !isPrimaryProfile()) {
packageManager.setComponentEnabledSetting(
myComponent,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
public boolean isPrimaryProfile() {
int userId = ActivityManagerNative.getDefault().getCurrentUser().id;
return (userId == PRIMARY_USER_ID) ? true : false;
}
При получении этого намерения MY_PACKAGE_REPLACED я сталкиваюсь со следующим исключением во время выполнения,
E/AndroidRuntime(13492): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной E/AndroidRuntime(13492): Процесс: com.abc.project, PID: 13492 E/AndroidRuntime(13492): java.lang.RuntimeException: Невозможно запустить приемник com.abc.project.receivers.OTAUpdateReceiver: java.lang.SecurityException: PermissionDenial: getCurrentUser() from pid=13492, uid=1032112, требует android.permission.INTERACT_ACROSS_USERS E/AndroidRuntime(13492): в android.app.Thava.:2776) E/AndroidRuntime(13492): на android.app.ActivityThread.access$1700(ActivityThread.java:160) E/AndroidRuntime(13492): на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) E/AndroidRuntime(13492): на android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime(13492): на android.os.Looper.loop(Looper.java:135) E/AndroidRuntime(13492): в android.app.ActivityThread.main(ActivityThread.java:5597) E/AndroidRuntime(13492): в java.lang.reflect.Method.invoke(собственный метод) E/AndroidRuntime(13492): в java.lang.reflect.Method.invoke(Method.java:372) E/AndroidRuntime(13492): на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:984) E/AndroidRuntime(13492): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) E/AndroidRuntime(13492): вызвано: java.lang.SecurityException: отказ в разрешении: getCurrentUser () from pid = 13492, uid = 1032112 требуется android.permission.INTERACT_ACROSS_USERS E/AndroidRuntime(13492): на android.os.Parcel.readException(Parcel.java:1566) E/AndroidRuntime(13492): на android.os.Parcel.readException(Parcel.java:1519) E/AndroidRuntime(13492): на android.app.ActivityManagerProxy.getCurrentUser(ActivityManagerNative.java:4816) E/AndroidRuntime(13492): на
Хотя это разрешение "INTERACT_ACROSS_USERS" определено в AndroidManifest.xml, оно не отражается. Я что-то упускаю? Или есть альтернативный способ добиться этого?
Моя основная цель - провести различие между основным и дополнительным профилем или убедиться, что пользователь не находится в основном профиле.
1 ответ
Возможность различать первичный и вторичный профиль с помощью API- интерфейса getSerialNumberForUser UserManager,
public boolean isPrimaryProfile(final Context context) {
UserHandle userHandle = Process.myUserHandle();
UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
return (userManager != null) ? userManager.getSerialNumberForUser(userHandle) == PRIMARY_USER_ID : false;
}
Значение PRIMARY_USER_ID равно 0 для основного пользователя / владельца.