Как отличить первичные и вторичные профили в Android? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь отключить компонент во время 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;
}

I 'когда я получаю это намерение MY_PACKAGE_REPLACED, я столкнулся со следующей исключительной ситуацией,

E / AndroidRuntime (13492): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main 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 = 10321android.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: отказ в разрешении: getCurrentUser () из 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 Ответ

0 голосов
/ 19 февраля 2019

Возможность различать первичный и вторичный профиль с помощью 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 для основного пользователя / владельца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...