Отказ в разрешении: 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. Смотрите эту ссылку

Другие вопросы по тегам