LiquidSnack / Warehouse-13

0 stars 1 forks source link

Вопрос #1

Open LiquidSnack opened 9 years ago

LiquidSnack commented 9 years ago

Вот предварительный список методов по добыче инфы: getPhoneType() getNetworkOperatorName() getNetworkCountryIso() getNetworkOperator() getNetworkType() getAllCellInfo()

Соответственно, по нажатию кнопки, эти методы должны применяться и результат выводиться в outputbox. Вопрос - мне нужно для каждого метода создавать string, int и т.д., чтобы добиться желаемого? getAllCellInfo(), например, вообще список выдаёт. Вот и не могу разобраться, как же всё-таки эти методы применить. Можешь пример какой-нибудь дать для наглядности?

ValentinParamonov commented 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;
}
ValentinParamonov commented 9 years ago

С методами, которые возвращают String, проблем нет - можно брать их результат напрямую:

String operatorName = telephonyManager.getNetworkOperatorName();
ValentinParamonov commented 9 years ago

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;
        ...
    }
}
LiquidSnack commented 9 years ago

Спасибо. Подправил код, осталось с CellInfo разобраться и пробовать запускать первую версию прототипа. Думаю, можно допустить, что у нас будет GSM сеть.

LiquidSnack commented 9 years ago

Я вроде бы разобрался с CellInfo, довольно большой кусок получился. Как думаешь, как лучше организовать вывод данных в окошко, по мере заполнения переменных, или в конце, всё разом? Ещё не забыть бы, что данные должны выводиться не поверх друг друга, а подряд... Надо будет не накосячить с setText...

ValentinParamonov commented 9 years ago

Я думаю, что лучше составить строку, а потом вывести её всю разом.

LiquidSnack commented 9 years ago

Пытаюсь разобраться в коде, пока получается не особо. Можешь пояснить вот этот кусок (в performNetworkTest):

outputBox.append("Operator: " + phoneInfo.getOperatorName()); for (Map.Entry<String, String> cellInfo : phoneInfo.getAllCellInfo() .entrySet()) { outputBox.append('\n' + cellInfo.getKey() + ": " + cellInfo.getValue()); }

Что делает цикл for?

ValentinParamonov commented 9 years ago

Этот цикл проходит по всем значениям словаря (Map), в котором хранятся параметры устройств (GSM, LTE, CDMA, WCDMA) в виде строк. В словаре строки лежат по ключам (ключ: значение). Метод entrySet() возвращает "список" пар (Map.Entry) ключ + значение. В цикле составляется строка вида "<новая строка>GSM: {<значения параметров GSM>}" (то же для LTE, CDMA, WCDMA, если они есть) и добавляется в TextBox. Попробуй запустить на эмуляторе, думаю, станет попонятнее.

LiquidSnack commented 9 years ago

Добавил 2 строки на вывод, текст почему-то съехал. А по поводу списка... Думаю если её привести к виду Network Type: GSM{...}, то будет ок. Переименовать GSM и GsmInfo, или просто убрать GsmInfo, а фразу Network Type можно просто текстом добавить.

ValentinParamonov commented 9 years ago

У классов GsmInfo, CdmaInfo, LteInfo и WcdmaInfo есть метод toString(). Он отвечает за формат строки. Перепиши его, как считаешь нужным.

LiquidSnack commented 9 years ago

Компилатор стал на R ругаться.

ValentinParamonov commented 9 years ago

Что пишет?

LiquidSnack commented 9 years ago

Вообще странно. Вроде писал, что cannot resolve symbol R, но после того, как я запустил, это сообщение изчезло.

LiquidSnack commented 9 years ago

Ну вот, теперь вроде нормально выглядит. Как мне правильно отправить изменения, чтобы ты увидел?

ValentinParamonov commented 9 years ago

Commit Changes в меню VCS.

LiquidSnack commented 9 years ago

Commit, Commit and Push или Create Patch?

ValentinParamonov commented 9 years ago

Commit and Push

LiquidSnack commented 9 years ago

Блин, просит Master password... Мой пароль для GitHub не подходит...

LiquidSnack commented 9 years ago

Вроде прошло.

LiquidSnack commented 9 years ago

Отправил преподу скрин, жду ответа. Думаю, теперь надо будет прикрутить сетевые функции - IP, ping GPS(если возможно) и прочее. Полистаю пока android.net.

LiquidSnack commented 9 years ago

Так, вроде восстановился. Теперь, похоже, надо заново Git настраивать. Поможешь?

LiquidSnack commented 9 years ago

Ну вот, препод наконец-то ответил. Тоже говорит, что пора серверную часть делать. Значит, пришло время. Вот, что ещё написал:

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).

Пойду, как говорят, покурю форумы.

LiquidSnack commented 9 years ago

Вот, нашёл такую информацию. 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 поковырять. Как-то всё негладко идёт...

ValentinParamonov commented 9 years ago

Я советую тебе больше задумываться о том, какие данные нужны, и что с ними можно сделать. Детали имплементации - это дело десятое, не стоит на них заморачиваться, пока нет чёткого представления о модели данных и функциональности системы. Когда определимся с этими вещами, тогда уже придумаем, как это всё собрать вместе наилучшим образом.

LiquidSnack commented 9 years ago

Ок. Апдейт, кстати, помог с дизайном. Препод дал пару мейлов людей из Бите, сказал с ними связаться и спросить, какой функционал добавить. Я не решался писать, пока серверная часть не работает, но ты меня убедил.

ValentinParamonov commented 9 years ago

Серьезно, будешь писать в Бите? Тогда, лучше, спрашивай не про функционал, а про то, в каких данных был бы заинтересован оператор, и какие операции с этими данными он хотел бы производить.

LiquidSnack commented 9 years ago

Чёрт. Я уже написал. Ладно, посмотрю, что из этого выйдет.

ValentinParamonov commented 9 years ago

Ну так просто поверни в то русло.

LiquidSnack commented 9 years ago

Ну вот, мне ответили из Бите: 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-страницу. Что скажешь?

ValentinParamonov commented 9 years ago

Мы данные будем слать, только когда будет интернет соединение? Если так, то будем слать JSON по HTTP.

LiquidSnack commented 9 years ago

Ну да, только когда есть соединение. Если нет - тогда break. Это как тут: http://hmkcode.com/android-send-json-data-to-server/

Для этого, как я понял, нужен сайт и сам сервер?

ValentinParamonov commented 9 years ago

Сервер нужен - да. Что ты имеешь ввиду сайт?

LiquidSnack commented 9 years ago

Данные можно посылать напрямую на сервер? Тогда веб-страница не нужна.

ValentinParamonov commented 9 years ago

Веб страница будет нужна админу, и она тоже будет обращаться к тому же серверу.

LiquidSnack commented 9 years ago

Протолкнул кое-какие изменения. Выводимой инфы становится всё больше, не могу найти, как скроллинг добавить.

ValentinParamonov commented 9 years ago

Типо так: http://stackoverflow.com/a/3256305/4387708

LiquidSnack commented 9 years ago

Спасибо. Осталось GPS допилить, проверку скорости и, собственно, отправку данных.

LiquidSnack commented 9 years ago

Поковырялся с GPS, глянь, как думаешь, сработает? А то на эмуляторе, понятное дело, все координаты по нулям.

LiquidSnack commented 9 years ago

Я смотрю разные способы, как замерить скорость подключения (Wi-Fi, 3G). Похоже, самый простой способ - это задействовать сервер. Послать данные и принять их. Далее вычисляется скорость приёма/передачи. Значит, пора как-то поднимать сервер...

LiquidSnack commented 9 years ago

Я создал класс для сетевых функций. В нём пока только проверка на наличие связи. Чтобы в случае отсутствия подключения появилось окно с предупреждением. Как мне из MainActivity воспользоваться методом isConnected, который в классе NetFunctions?

LiquidSnack commented 9 years ago

А что нужно, чтобы создать сервер? Он нужен не только, чтобы посылать найденные данные, но и чтобы замерить скорость download/upload.

LiquidSnack commented 9 years ago

Насчёт AsyncTask вопрос. Я так понял, то что будет выполняться, описывается в методе doInBackground? Если так, то получается, мне надо там прописать пинг, вместо существующего метода. Можно также там прописать получение некоего ответа от сервера? Чтобы сравнить полученные/отправленные байты до и после.

ValentinParamonov commented 9 years ago

Может, всётаки, лучше проверять пинг на стороне сервера?

LiquidSnack commented 9 years ago

А это как?

ValentinParamonov commented 9 years ago

Прихлабучить время отправки к запросу.

LiquidSnack commented 9 years ago

Я пока додумался только поставить урл сервера в метод ping. Надо пораскинуть мозгами...

LiquidSnack commented 9 years ago

Сделал очередной коммит. В MyLocationListener перелопатил функции GPS. В NetFunctions сделал асинхронное задание. Там в комментах пару вопросов написал. Посмотри, если будет время.

LiquidSnack commented 9 years ago

Попытался запустить на телефоне, получил INSTALL_FAILED_OLDER_SDK

ValentinParamonov commented 9 years ago

Найди какому API Level соответствует версия твоего Андроида и поставь соответствующую minSdkVersion в манифесте (17 скорее всего).

LiquidSnack commented 9 years ago

Так и сделал. Запустилось, но прогнать тест не получилось: 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)