Подтвердить что ты не робот

Разрешение отказа: 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.Что делать, просто добавьте разрешения? Я не хочу добавлять разрешения, о которых я ничего не знаю о них. Может ли кто-нибудь мне помочь, очень спасибо!

4b9b3361

Ответ 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. См. Ссылку