Отказ в разрешении: startActivity запрашивает запуск от имени пользователя -2, но вызывает пользователя 0; это требует android.permission.INTERACT_ACROSS_USERS_FULL
Когда я пытаюсь использовать android 'am' для запуска действия, это неправильно под платформой 4.2 (я пробовал, под версией 2.3 нормально). Код такой
out = process.getOutputStream();
out.write(("am start -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity\n").getBytes());
out.flush();
InputStream in = process.getInputStream();
BufferedReader re = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = re.readLine()) != null) {
Log.d("conio","[result]"+line);
}
и ошибка такая:
java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
at android.os.Parcel.readException(Parcel.java:1425)
at android.os.Parcel.readException(Parcel.java:1379)
at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1921)
at com.android.commands.am.Am.runStart(Am.java:494)
at com.android.commands.am.Am.run(Am.java:109)
at com.android.commands.am.Am.main(Am.java:82)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235)
at dalvik.system.NativeStart.main(Native Method)
я хочу знать
1. что означает пользователь -2 и 0?
2. где я могу найти подробности об этих идентификаторах?
3. что мне делать, просто добавить разрешения? Я не хочу добавлять разрешения, о которых я ничего не знаю. Кто-нибудь может мне помочь, большое спасибо!
4 ответа
1) В linux у каждого пользователя есть идентификационный номер. 0 и -2 - идентификаторы пользователя (UID). 0 - это root, -2 - это какой-то случайный пользователь (это может быть не человек, это может быть просто поддельная учетная запись, используемая по внутренним причинам).
2) Любая книга по Linux. Android - это просто графическая структура поверх Linux.
3) Да, просто добавьте разрешение.
Пользователь 0 и пользователь -2, которые вы видите, являются пользовательскими идентификаторами платформы, а не Linux С android.os.UserHandle вы можете видеть, что userId
0 - владелец устройства, USER_OWNER
(это полностью отличается от Linux uid
0, что является корнем). userId
-1 представляет всех пользователей (USER_ALL
), userId
-2 представляет текущего пользователя (USER_CURRENT
), userId
-3 представляет текущего пользователя или себя (CURRENT_OR_SELF
), а также userId
-10000 представляет нулевого пользователя (USER_NULL
).
Насколько разрешение INTERACT_ACROSS_USERS_FULL
Вы можете объявить его в своем файле манифеста, но вы получите его только в том случае, если ваше приложение находится в образе системы Android или подписано тем же сертификатом, что и другое приложение в образе системы, который объявляет разрешение. Другими словами это signature
или же signatureOrSystem
разрешение.
Как упоминалось в комментарии @juanmf, добавление --user 0
вариант с командой решил проблему для меня. Результирующая команда будет выглядеть так:
am start --user 0 -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity
Я получал эту ошибку после того, как мой планшет Samsung Galaxy Tab Active 2 был обновлен до Android 9. После долгих поисков я нашел этот пост, в котором предлагалось отключить параметры разработчика, перезапустить планшет, а затем снова включить параметры разработчика. В итоге я просто выключил отладку по USB, перезапустил, затем снова включил отладку по USB, и после этого все заработало.
Разрешения - это просто строка кода, которую нужно добавить в манифест, чтобы сообщить, что вы обращаетесь к этим ресурсам и запрашиваете Android для разрешения использования этих ресурсов.
1) Я только что добавил пример, содержащий разрешение.
2) В Linux есть пользователь root, группа и другие. 0 приходит к корню и UID не может быть отрицательным, его значение находится в диапазоне от 0 до 999. Смотрите эту ссылку