我正试图在应用程序OTA期间在我的辅助配置文件上禁用一个组件。我正在编写一个接收器,通过捕获"android.intent.action.MY_PAGE_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):致命异常:mainE/AndroidRuntime(13492):进程:com.abc.project,PID:13492E/AndroidRuntime(13492):java.lang.RuntimeException:无法启动receiver com.abc.project.rereceivers.OTAUpdateReceiver:java.lang.SecurityException:PermissionDenial:getCurrentUser()来自pid=13492,uid=1032112需要android.permission.INTERACT_ACROSS_USERS E/AndroidRuntime(13492):位于android.app.ActivityThread.handleReceiver(ActivityThreads.java:2776)E/AndroidRuntime(13492):在android.app.ActivityThread.access$1700(ActivityThreads.java:160)E/AndroidRuntime(13492):在android.app.ActivityThread$H.handleMessage(ActivityThreads.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(ActivityThreads.java:5597)E/AndroidRuntime(13492):位于java.lang.reflect.Method.ioke(Native方法)E/AndroidRuntime(13492):在java.lang.reflect.Method.ioke(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(ZygoteNit.java:779)E/AndroidRuntime(13492):由java.lang.SecurityException引起:拒绝权限:getCurrentUser(),来自pid=13492,uid=1032112需要android.permission.INTERACT_ACROSS_USERSE/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(ActivityManager Native.java:4816)E/AndroidRuntime(13492):在
尽管在AndroidManifest.xml中定义了此权限"INTERACT_ACROSS_USERS",但它没有得到反映。我是不是错过了什么?或者有其他方法可以实现这一点吗?
我的主要目标是区分主配置文件和辅助配置文件,或者确保用户不在主配置文件中。
能够在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;
}
对于主要用户/所有者,PRIMARY_USER_ID的值为0。