Open LiquidSnack opened 9 years ago
У класса TelephonyManager eсть куча статических полей. Вот, например, те, которые касаются типа телефона:
PHONE_TYPE_CDMA
PHONE_TYPE_GSM
PHONE_TYPE_NONE
PHONE_TYPE_SIP
Тоесть, придеться парсить результаты тех методов, которые возвращают инты. Что-то вроде:
int phoneType = telephonyManager.getPhoneType();
String phoneTypeString;
switch(phoneType) {
case PHONE_TYPE_CDMA:
phoneTypeString = "CDMA";
break;
case PHONE_TYPE_GSM:
phoneTypeString = "GSM";
break;
case PHONE_TYPE_NONE:
phoneTypeString = "No radio";
break;
case PHONE_TYPE_SIP:
phoneTypeString = "SIP";
break;
}
С методами, которые возвращают String, проблем нет - можно брать их результат напрямую:
String operatorName = telephonyManager.getNetworkOperatorName();
getAllCellInfo возвращает список объектов CellInfo. Здесь сложность в том, что CellInfo имеет четыре подкласса: CellInfoCdma, CellInfoGsm, CellInfoLte и CellInfoWcdma, каждый со своей конкретной информацией. Сначала нужно опознать, с каким объектом мы имеем дело, и дальше уже работать с этим конкретным объектом:
List<CellInfo> cellInfos = telephonyManager.getAllCellInfo();
for(CellInfo cellInfo : cellInfos) {
if(cellInfo instanceof CellInfoCdma) {
CellInfoCdma cdma = (CellInfoCdma) cellInfo;
CellSignalStrengthCdma signalStrength = cdma.getCellSignalStrength();
int asuLevel = signalStrength.getAsuLevel();
...
} else if(cellInfo instanceof CellInfoGsm) {
CellInfoGsm gsm = (CellInfoGsm) cellInfo;
...
} else if(cellInfo instanceof CellInfoLte) {
CellInfoLte lte = (CellInfoLte) cellInfo;
...
} else if(cellInfo instanceof CellInfoWcdma) {
CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
...
}
}
Спасибо. Подправил код, осталось с CellInfo разобраться и пробовать запускать первую версию прототипа. Думаю, можно допустить, что у нас будет GSM сеть.
Я вроде бы разобрался с CellInfo, довольно большой кусок получился. Как думаешь, как лучше организовать вывод данных в окошко, по мере заполнения переменных, или в конце, всё разом? Ещё не забыть бы, что данные должны выводиться не поверх друг друга, а подряд... Надо будет не накосячить с setText...
Я думаю, что лучше составить строку, а потом вывести её всю разом.
Пытаюсь разобраться в коде, пока получается не особо. Можешь пояснить вот этот кусок (в performNetworkTest):
outputBox.append("Operator: " + phoneInfo.getOperatorName()); for (Map.Entry<String, String> cellInfo : phoneInfo.getAllCellInfo() .entrySet()) { outputBox.append('\n' + cellInfo.getKey() + ": " + cellInfo.getValue()); }
Что делает цикл for?
Этот цикл проходит по всем значениям словаря (Map), в котором хранятся параметры устройств (GSM, LTE, CDMA, WCDMA) в виде строк. В словаре строки лежат по ключам (ключ: значение). Метод entrySet() возвращает "список" пар (Map.Entry) ключ + значение. В цикле составляется строка вида "<новая строка>GSM: {<значения параметров GSM>}" (то же для LTE, CDMA, WCDMA, если они есть) и добавляется в TextBox. Попробуй запустить на эмуляторе, думаю, станет попонятнее.
Добавил 2 строки на вывод, текст почему-то съехал. А по поводу списка... Думаю если её привести к виду Network Type: GSM{...}, то будет ок. Переименовать GSM и GsmInfo, или просто убрать GsmInfo, а фразу Network Type можно просто текстом добавить.
У классов GsmInfo, CdmaInfo, LteInfo и WcdmaInfo есть метод toString(). Он отвечает за формат строки. Перепиши его, как считаешь нужным.
Компилатор стал на R ругаться.
Что пишет?
Вообще странно. Вроде писал, что cannot resolve symbol R, но после того, как я запустил, это сообщение изчезло.
Ну вот, теперь вроде нормально выглядит. Как мне правильно отправить изменения, чтобы ты увидел?
Commit Changes в меню VCS.
Commit, Commit and Push или Create Patch?
Commit and Push
Блин, просит Master password... Мой пароль для GitHub не подходит...
Вроде прошло.
Отправил преподу скрин, жду ответа. Думаю, теперь надо будет прикрутить сетевые функции - IP, ping GPS(если возможно) и прочее. Полистаю пока android.net.
Так, вроде восстановился. Теперь, похоже, надо заново Git настраивать. Поможешь?
Ну вот, препод наконец-то ответил. Тоже говорит, что пора серверную часть делать. Значит, пришло время. Вот, что ещё написал:
Būtu noderīgi savākt datus par datu pārraides niansēm - piem, kāda etalon-faila lejupielādes un augšupielādes laiki no servera, ping utt. Kā arī info par pašu aparātu, uz kura viss notiek. Būtu labi pielikt klāt arī iespēju pierakstīt īsi kas par problēmu (datu pārraide lēna, nav savienojuma utt. - vai arī pat labāk to izveidot kā izvēlni).
Пойду, как говорят, покурю форумы.
Вот, нашёл такую информацию. http://stackoverflow.com/questions/5666109/how-to-send-a-data-to-a-web-server-from-android
Странно, у меня почему-то Design перестал работать: Rendering Problems Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layout to choose a different layout, or fix the theme style references. Couldn't resolve resource @dimen/activity_horizontal_margin (5 similar errors not shown) "@dimen/activity_horizontal_margin" in attribute "paddingLeft" is not a valid format. (Edit) (4 similar errors not shown) Failed to find style 'textViewStyle' in current theme (6 similar errors not shown)
Я так понял, надо файл activity_main.xml поковырять. Как-то всё негладко идёт...
Я советую тебе больше задумываться о том, какие данные нужны, и что с ними можно сделать. Детали имплементации - это дело десятое, не стоит на них заморачиваться, пока нет чёткого представления о модели данных и функциональности системы. Когда определимся с этими вещами, тогда уже придумаем, как это всё собрать вместе наилучшим образом.
Ок. Апдейт, кстати, помог с дизайном. Препод дал пару мейлов людей из Бите, сказал с ними связаться и спросить, какой функционал добавить. Я не решался писать, пока серверная часть не работает, но ты меня убедил.
Серьезно, будешь писать в Бите? Тогда, лучше, спрашивай не про функционал, а про то, в каких данных был бы заинтересован оператор, и какие операции с этими данными он хотел бы производить.
Чёрт. Я уже написал. Ладно, посмотрю, что из этого выйдет.
Ну так просто поверни в то русло.
Ну вот, мне ответили из Бите: Manuprāt, vēl būtu nepieciešama šāda informācija: 1) Laiks un GPS koordinātes; 2) Pakešu zudums (ping tests); 3) Ātruma pārbaude; Kādus iespējamos variantus izskatat datu sūtīšanai?
А у меня только 1 вариант - отсылать в виде html на какую-нибудь php-страницу. Что скажешь?
Мы данные будем слать, только когда будет интернет соединение? Если так, то будем слать JSON по HTTP.
Ну да, только когда есть соединение. Если нет - тогда break. Это как тут: http://hmkcode.com/android-send-json-data-to-server/
Для этого, как я понял, нужен сайт и сам сервер?
Сервер нужен - да. Что ты имеешь ввиду сайт?
Данные можно посылать напрямую на сервер? Тогда веб-страница не нужна.
Веб страница будет нужна админу, и она тоже будет обращаться к тому же серверу.
Протолкнул кое-какие изменения. Выводимой инфы становится всё больше, не могу найти, как скроллинг добавить.
Спасибо. Осталось GPS допилить, проверку скорости и, собственно, отправку данных.
Поковырялся с GPS, глянь, как думаешь, сработает? А то на эмуляторе, понятное дело, все координаты по нулям.
Я смотрю разные способы, как замерить скорость подключения (Wi-Fi, 3G). Похоже, самый простой способ - это задействовать сервер. Послать данные и принять их. Далее вычисляется скорость приёма/передачи. Значит, пора как-то поднимать сервер...
Я создал класс для сетевых функций. В нём пока только проверка на наличие связи. Чтобы в случае отсутствия подключения появилось окно с предупреждением. Как мне из MainActivity воспользоваться методом isConnected, который в классе NetFunctions?
А что нужно, чтобы создать сервер? Он нужен не только, чтобы посылать найденные данные, но и чтобы замерить скорость download/upload.
Насчёт AsyncTask вопрос. Я так понял, то что будет выполняться, описывается в методе doInBackground? Если так, то получается, мне надо там прописать пинг, вместо существующего метода. Можно также там прописать получение некоего ответа от сервера? Чтобы сравнить полученные/отправленные байты до и после.
Может, всётаки, лучше проверять пинг на стороне сервера?
А это как?
Прихлабучить время отправки к запросу.
Я пока додумался только поставить урл сервера в метод ping. Надо пораскинуть мозгами...
Сделал очередной коммит. В MyLocationListener перелопатил функции GPS. В NetFunctions сделал асинхронное задание. Там в комментах пару вопросов написал. Посмотри, если будет время.
Попытался запустить на телефоне, получил INSTALL_FAILED_OLDER_SDK
Найди какому API Level соответствует версия твоего Андроида и поставь соответствующую minSdkVersion в манифесте (17 скорее всего).
Так и сделал. Запустилось, но прогнать тест не получилось: 04-05 13:20:45.401 2163-2163/com.mag.boikov.testapp E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.NullPointerException at com.mag.boikov.testapp.network_info.PhoneInfo.getAllCellInfo(PhoneInfo.java:66) at com.mag.boikov.testapp.MainActivity.performNetworkTest(MainActivity.java:114) at com.mag.boikov.testapp.MainActivity$1.onClick(MainActivity.java:61) at android.view.View.performClick(View.java:4432) at android.view.View$PerformClick.run(View.java:18338) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5283) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) at dalvik.system.NativeStart.main(Native Method)
Вот предварительный список методов по добыче инфы: getPhoneType() getNetworkOperatorName() getNetworkCountryIso() getNetworkOperator() getNetworkType() getAllCellInfo()
Соответственно, по нажатию кнопки, эти методы должны применяться и результат выводиться в outputbox. Вопрос - мне нужно для каждого метода создавать string, int и т.д., чтобы добиться желаемого? getAllCellInfo(), например, вообще список выдаёт. Вот и не могу разобраться, как же всё-таки эти методы применить. Можешь пример какой-нибудь дать для наглядности?