Разрешение отказа: 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.Что делать, просто добавьте разрешения? Я не хочу добавлять разрешения, о которых я ничего не знаю о них. Может ли кто-нибудь мне помочь, очень спасибо!
Ответы
Ответ 1
1) В linux каждый пользователь имеет номер id. 0 и -2 - идентификаторы пользователей (UID). 0 - корень, -2 - некоторый случайный пользователь (который может не быть человеком, он может быть просто фальшивой учетной записью, используемой по внутренним причинам).
2) Любая книга по Linux. Android - это всего лишь графическая структура поверх Linux.
3) Да, просто добавьте разрешение.
Ответ 2
Пользователь 0 и пользователь -2, которые вы видите, являются файлами userIds, а не Linux uids. Из 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
.
Ответ 3
Как упоминалось в комментарии @juanmf, добавление опции --user 0
к команде разрешило проблему для меня. Полученная команда будет выглядеть так:
am start --user 0 -a android.intent.action.VIEW -n com.android.browser/com.android.browser.BrowserActivity
Ответ 4
Я получал эту ошибку после того, как мой планшет Samsung Galaxy Tab Active 2 обновился до Android 9. После долгих поисков я обнаружил этот пост, в котором предлагалось отключить параметры разработчика, перезагрузить планшет, а затем снова включить параметры разработчика. В итоге я просто отключил отладку USB, перезапустил, затем снова включил отладку USB, и все после этого работало нормально.
Ответ 5
Разрешения - это всего лишь строка кода, которую нужно добавить в манифест, чтобы сообщить, что вы обращаетесь к этим ресурсам и запрашиваете андроид, чтобы эти ресурсы могли использоваться. ![enter image description here]()
1) я просто добавил пример, содержащий разрешение.
2) В Linux есть пользователь root, группа и другие. 0 доходит до корня и UID не может быть отрицательным, его значение находится в диапазоне от 0 до 999. См. Ссылку