2013-03-07 2 views
2

Одна из функций моего приложения отправляет данные через Интернет. Перед тем, как отправить данные, проверить, существует ли связь:Создание андроидального AVD без 3G-соединения

private boolean isConnected() { 
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo.State val1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); 
    NetworkInfo.State val2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); 
    return NetworkInfo.State.CONNECTED.equals(val1) || NetworkInfo.State.CONNECTED.equals(val2); 
} 

Это работало прекрасно на эмуляторе и несколько реальных устройств я тестировал на. Затем я получил сообщение об ошибке от клиента, которое по расследованию оказалось NullPointerException на линии getState для TYPE_MOBILE.

По-видимому, connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) вернулся null на устройство, у которого не было 3G (планшет WiFi). Хотя я тестировал эмулятор Nexus 7, я не получил эту ошибку.

Следовательно, меня интересует создание AVD, который явно не имеет 3G (т. Е. AVD для устройства WiFi), чтобы я мог исследовать/тестировать такие сценарии. Я ничего не нашел в настройках эмулятора, но, возможно, я просто искал не то место. Возможно ли это?

ответ

1

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

private boolean isConnected(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info1 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    NetworkInfo info2 = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    NetworkInfo.State val1 = (info1 == null ? null : info1.getState()); 
    NetworkInfo.State val2 = (info2 == null ? null : info2.getState()); 
    return (info1 != null && NetworkInfo.State.CONNECTED.equals(val1)) || (info2 != null && NetworkInfo.State.CONNECTED.equals(val2)); 
} 

Это заботится о null значений, когда интерфейс нет.

3

Вы должны иметь возможность изменить параметры оборудования для AVD, чтобы удалить модем. Опция помечена как hw.gsmModem, но я считаю, что она отключает все «сотовые данные», а не только GSM.

Если вы хотите изменить параметры оборудования без использования AVD Manager, отредактируйте файл config.ini, находящийся в папке avd. По умолчанию эта папка находится по адресу:

  • Linux/Mac: ~/.android/AVD/yourAvdName

  • Windows Vista/7/8 (?): C: \ Пользователи \ .android \ yourAvdName

  • Windows XP: C: \ Documents и Settings \ .android \ yourAvdName

Просто добавьте строку, которая говорит:

hw.gsmModem=no 

См here и here более подробно.


Однако, вы можете быть в состоянии проверить это, отключив 3G вместо этого, нажав F8 в эмуляторе. Я не знаю, будет ли это симулировать нуль, который вы ищете, но это стоит того.

См. here для получения дополнительных сокращений.

+0

Я попытался отключить данные 3G - это имитирует выключение 3G-данных в телефоне, а информация о подключении не равна нулю, вместо этого его getState возвращает DISCONNECTED. Понятно, что это не то, что мне нужно. –

+0

Я даже не могу найти, где удалить hw.gsmModem. Последняя версия менеджера ADV не дает мне этих параметров. Я полагаю, я мог бы выследить xml для avd, но отключить все данные ячеек не вариант для меня. Наверное, я просто добавлю проверки на нули. –

+0

Я немного обновил свой менеджер AVD, но вам не нужно менять параметры в любом случае. Отредактировано с инструкциями. – Geobits

Смежные вопросы