如何区分Android中的主配置文件和辅助配置文件?

如何区分Android中的主配置文件和辅助配置文件?,android,android-intent,android-permissions,android-runtime,android-user-profile,Android,Android Intent,Android Permissions,Android Runtime,Android User Profile,我正在尝试在我的辅助配置文件中禁用应用程序OTA期间的组件。我正在编写一个接收器,通过捕获“android.intent.action.MY_PACKAGE_REPLACED”来禁用该组件。在此处添加我的AndroidManifest.xml更改 <receiver android:name=".receivers.OTAUpdateReceiver"android:exported="true"> <intent-filter> <action

我正在尝试在我的辅助配置文件中禁用应用程序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>
当我收到这个MY_包时,我面临以下运行时异常

E/AndroidRuntime(13492):致命异常:主 E/AndroidRuntime(13492):进程:com.abc.project,PID:13492 E/AndroidRuntime(13492):java.lang.RuntimeException:无法启动 receiver com.abc.project.receivers.OTAUpdateReceiver: java.lang.SecurityException:PermissionDenial:getCurrentUser()来自 pid=13492,uid=1032112需要 android.permission.interaction_跨_用户E/AndroidRuntime(13492):在 android.app.ActivityThread.HandlerReceiver(ActivityThread.java: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):在 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):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) E/AndroidRuntime(13492):由以下原因引起:java.lang.SecurityException: 权限拒绝:来自pid=13492、uid=1032112的getCurrentUser() 需要android.permission.interaction\u跨用户 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(ActivityManagerActive.java:4816) E/AndroidRuntime(13492):在

尽管该权限“跨用户交互”是在AndroidManifest.xml中定义的,但并未得到反映。我遗漏了什么吗?或者有没有其他方法来实现这一点


我的主要目标是区分主要配置文件和次要配置文件,或者确保用户不在主要配置文件中。

能够在UserManager的getSerialNumberForUserapi的帮助下区分主要配置文件和次要配置文件

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;
}
对于主用户/所有者,主用户ID的值为0

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;
}
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;
}