如何在Android中区分主要个人资料和辅助个人资料?

时间:2019-02-01 16:40:46

标签: 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 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()来自   pid = 13492,uid = 1032112需要   android.permission.INTERACT_ACROSS_USERS E / AndroidRuntime(13492):在   android.app.ActivityThread.handleReceiver(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):位于   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):位于   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)   E / AndroidRuntime(13492):原因:java.lang.SecurityException:   权限拒绝:来自pid = 13492,uid = 1032112的getCurrentUser()   需要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 个答案:

答案 0 :(得分:0)

能够借助UserManager的 getSerialNumberForUser API

来区分主要配置文件和辅助配置文件
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。