Как изменить языковое устройство через adb [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

7
задан user3258796 11 February 2014 в 22:26
поделиться

8 ответов

Ваши ошибки не имеют ничего общего с adb. Вам просто не хватает понимания того, как ваша локальная оболочка обрабатывает вашу команду. Вы выполняете эти команды локально (на вашем ПК):

adb shell setprop persist.sys.language fr
setprop persist.sys.country CA
stop
sleep 5
start

и сообщения об ошибках, которые вы видите, из локальной оболочки (т. Е. В вашей системе нет исполняемого файла setprop и start и stop имеют необязательные параметры.

правильная команда будет

adb shell "setprop persist.sys.language fr; setprop persist.sys.country CA; setprop ctl.restart zygote"

или в более поздних версиях Android:

adb shell "setprop persist.sys.locale fr-CA; setprop ctl.restart zygote"
20
ответ дан Alex P. 18 August 2018 в 20:45
поделиться
  • 1
    Я пробую вашу команду, но ничего не происходит: / – user3258796 11 February 2014 в 23:29
  • 2
    вам все еще нужно root. Я просто объяснил наиболее очевидную ошибку – Alex P. 11 February 2014 в 23:31
  • 3
    Я не могу укоротить свое устройство: / – user3258796 11 February 2014 в 23:32
  • 4
    @ user3258796 - тогда вам, похоже, не удастся достичь своей цели, но, скорее всего, вам придется использовать меню настроек на устройстве. – Chris Stratton 12 February 2014 в 18:36

Вы можете изменить язык / язык для целей тестирования без укорачивания устройства, а также на более новых (4.2+) устройствах. Вы должны создать приложение, которое изменяет локаль устройства . Или вы можете использовать вспомогательное приложение, например. Изменить язык АБР .

Затем, на устройствах с более высокой скоростью, вы должны использовать предоставление разрешения CHANGE_CONFIGURATION через adb, adb shell pm grant <package_name> android.permission.CHANGE_CONFIGURATION.

Наконец, вы можете использовать команды adb (активность запуска) для переключения локаль.

8
ответ дан Community 18 August 2018 в 20:45
поделиться

Вы не можете сделать это с помощью adb на своем устройстве. Ваш adb вне устройства, я имею в виду на вашем компьютере, подключенном к usb, может изменить его с передачей разрешения перед изменением языка.

На вашем устройстве напрямую требуется корневое устройство.

-5
ответ дан Luser_k 18 August 2018 в 20:45
поделиться
  • 1
    так, что вы предлагаете? Я не могу укоротить устройство. Мне нужно изменить язык через appium и python – user3258796 11 February 2014 в 23:07
  • 2
    Так почему вы даете мне «-1», когда он на устройстве без укоренения невозможен? Есть еще один вариант, который вы можете сделать ... вам нужен сервер-клиент, это означает, что ваше приложение и сервер общаются, и устройство отправляет команду сделать скриншот adb на сервере! Другими словами, не adb на вашем устройстве делает скриншот, это делает adb на сервере. Это хороший обход. – Luser_k 12 February 2014 в 18:54
  • 3
    Я не даю вам никаких очков. У меня есть небольшая точка репутации для голосования – user3258796 12 February 2014 в 23:55

Попробуйте это

adb shell "su -c 'setprop persist.sys.language fr; setprop persist.sys.country CA; stop; sleep 5; start'

Вам понадобится корневое устройство.

2
ответ дан Marco Acierno 18 August 2018 в 20:45
поделиться
  • 1
    Возможно, неправильный синтаксис. Сейчас я занимаюсь некоторыми исследованиями, чтобы узнать больше об этом. Или, может быть, недостающие команды вызваны неуправляемым устройством, которое скрывает эти команды? Не знаю, я получил эту команду некоторое время назад, где работал, когда я ее использовал. – Marco Acierno 11 February 2014 в 22:29
  • 2
    Мне нужно сделать это на непринужденном устройстве. – user3258796 11 February 2014 в 22:31
  • 3
    или, может быть, у вас есть идея изменить язык, используя appium и python? Мне это нужно для автоматизированных тестов – user3258796 11 February 2014 в 22:40

Выполните следующие шаги:

  • Создайте эмулятор с API-интерфейсами google Intel x86
  • Создайте эмулятор, выполнив команду:
    adb root
    
  • Запустите следующую команду оболочки через adb:
    adb -e shell "su root; setprop persist.sys.locale pt-PT; stop; sleep 2; start” 
    
    , затем выйдите из оболочки, которая перезапускает эмулятор.
  • Локали нам нужны для скриншотов:
    de_DE
    en_EN
    fr_FR
    ko_KO
    pt_PT
    es_ES
    ja_JA
    
1
ответ дан Tim Visée 18 August 2018 в 20:45
поделиться

Это повсюду, если просто

setprop будет работать только на AVD или корневом физическом устройстве

. Альтернативой является использование настроек в Launcher .

Укорененное устройство или AVD это работает:

<android-sdk path>/platform-tools/adb shell
root@generic:/ # getprop persist.sys.language
getprop persist.sys.language
en
root@generic:/ # setprop persist.sys.language fr
setprop persist.sys.language fr
root@generic:/ # setprop persist.sys.country CA
setprop persist.sys.country CA
root@generic:/ # stop
stop
root@generic:/ # start
start
root@generic:/ # sleep 5
sleep 5
root@generic:/ # getprop |grep lang
getprop |grep lang
[persist.sys.language]: [fr]
root@generic:/ # getprop |grep country
getprop |grep country
[persist.sys.country]: [CA]
root@generic:/ #
2
ответ дан Tricia 18 August 2018 в 20:45
поделиться
  • 1
    Он работает только один раз. Когда я меняю системный язык во второй раз, ничего не происходит – Maksim Dmitriev 6 September 2016 в 10:42
  • 2
    Мое устройство - эмулятор с Android N – Maksim Dmitriev 6 September 2016 в 10:49

Для Android M или новее вам нужно использовать:

setprop ro.product.locale xx-XX
setprop persist.sys.locale xx-XX

xx - это язык, XX - страна

1
ответ дан user7367641 18 August 2018 в 20:45
поделиться
  • 1
    Не повезло на N, используя pt-BR (бразильский португальский) после adb shell. – spaaarky21 2 November 2017 в 00:21

Решение сделать это без укоренения. Вы можете использовать что-то вроде этой функции ниже. Функция переходит в настройки и использует пользовательский интерфейс для изменения настроек локали.

https://github.com/dtmilano/AndroidViewClient/blob/480ab93dbd01296a68c1ce7109ceb8275d1ed8a7/src/com/dtmilano/android/viewclient .py # L1302

Трудная часть состоит в том, чтобы перейти на правильный язык, когда вы находитесь на другом языке. Вы считаете, что язык всегда поддерживает тот же самый индекс в списке, но, к сожалению, нет. Поэтому у вас должно быть такое решение.

Con: Вы должны немного настроить его для обработки разных телефонов, настройки могут иметь другой порядок.

0
ответ дан Vinayaka 18 August 2018 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: