Как стать автором
Обновить

Комментарии 61

Подскажите пожалуйста хороший хайлайтер Java-кода, сгенерированный код которого можно было бы вставить без проблем в статью хабра. Пока он подсвечен при помощи s-c.me/ с синтаксисом JavaScript — варианта лучше не нашел.
Используйте стандартные теги Хабра:
<source lang="java">
&It/source>
Извиняйте… Вот так:
<source lang="java">
<!--Ваш код-->
&lt/source>
Спасибо, поправил.
Вот еще была бы возможность в список значений запихивать что-то кроме строк — не жизнь была бы, а малина…

А вообще, пытаюсь программировать под андроид и чем дальше, тем больше разочаровываюсь в нем. Столько всего позакрывали «во имя безопасности», что тошнит. Да и средства для разработки довольно убогие. :(
Расскажите, пожалуйста, поподробнее чего вам не хватает под Андроидом, что есть на других мобильных платформах. Пишу под Андроид ~полгода, возможностей вполне хватает. И про убогость средств разработки поподробнее пожалуйста.
А я про другие мобильные платформы ничего не говорил, потому что не пробовал. :) Про остальное написал ниже.
Да, расскажите, пожалуйста, более подробно. Я сейчас работаю над портированием программы написанной под Windows Mobile на Андроид и первоначально мы, с коллегами, оценивали время портирования в 3-4 месяца т.к. опыта работы с Андроидом не было вообще. Сейчас уже видно, что укладываемся мы в 2-е меньшие сроки. Хотя у нас есть одно преимущество: мы точно знаем, что должны получить на «выходе», а также допускаем, что 1-я версия портированной программы еще будет требовать последующих улучшений, но все-же 3 месяца и 1, по крайней мере для меня, большая разница. Из самых больших сложностей, которые были, это привыкнуть к Эклипсу после VS (больше всего раздражали всплывающие подсказки, которые вылазят при малейшем движении мышкой и «нестандартные» шорткаты, но ко всему этому очень быстро привыкаешь и в студии уже постоянно жму ctrl+shift+f вместо ctrl+k,d :)
Вот еще была бы возможность в список значений запихивать что-то кроме строк


Уверен что есть такая возможность. Что-нибудь по аналогии с setListAdapter() у ListActivity, где можно указать свой адаптер, унаследованный от ArrayAdapter. Посмотрите в этом направлении.
Да и средства для разработки довольно убогие.


Попробуйте IntelliJ IDEA 10 Community Edition — я (и не только я) считаю идею лучшей IDE для Java-проектов, а Community Edition — это свободная версия с поддержкой разработки под Android.
А каких полезных вещей, например, в эклипсе нет, но есть в идее?
Например анализ кода в идее мне нравится больше, чем в эклипсе.
Вобще, главная причина по котрой я выбрал идею — с другими языками (пхп и питон) работаю в иде на базе идеи, а разводить зоопарк из инструментов не люблю.
Спасибо, попробую. Но у меня главные претензии не к IDE, а к эмулятору (см. ниже).
Эмулятор используется стандартный, из SDK. Сначала устанавливается SDK, скачиваются нужные версии эмуляторов, и собственно сами SDK для нужных платформ (1.6, 2.0, 2.1, 2.2 и т.п.), а идее нужно только показать где все это лежит. Там же, в SDK, создаются профили AVD, которые потом используются в идее при запуске или отладке приложений.
Вот этот-то стандартный эмулятор мне и не нравится. Например тем, что некоторые функции в нем работают не так, как на реальном железе. А еще многих функций просто нет. То есть, для написания интерфейса им можно пользоватся, а для чего-то более серьезного очень тяжело.
Логичным бы было, все таки приобрести устройство для тестов.
Устройство есть. Но в процессе написания программы удобнее было бы, все-таки, использовать эмулятор. Иначе для чего он вообще нужен?
Для простых тестов, в основном для теста интерфейса, там можно протестировать ВСЕ кроме железной части. Даже железная часть можно частично эмулировать и проверить.

Звонки, смс, gps, мобильный интернет, батарейка и тд…
Ну вот я раньше в вопросах, а потом тут чуть ниже привел пример того, как сообщение (программное — имитация нажатия кнопки на гарнитуре) по-разному обрабатывается в эмуляторе и на железяке. В телефоне оно просто отвечает на звонок, причем для срабатывания нужно сгенерировать и нажатие, и отпускание. А в эмуляторе для для ответа на звонок достаточно сообщения об отпускании кнопки, нажатие же запускает аудиоплеер. Казалось бы, программная часть, не железо. Что там может отличаться? Вот такие мелочи и раздражают. Получается, что код, проверенный на эмуляторе, отказывается работать в телефоне.
Хорошо, а что по этому поводу сказано в АПИ и офф доках?
А ничего. :) Это недокументированный способ ответить на звонок программно. Поскольку документированного не существует.

KEYCODE_HEADSETHOOK

Key code constant: Headset Hook key. Used to hang up calls and stop media.
>Это недокументированный способ ответить на звонок программно

Тогда чему вы удивляетесь?
Я удивляюсь тому, что эмулятор и железо ведут себя по-разному. Сама по себе посылка сообщения — вполне нормальная операция. Обрабатывается она софтом, а не железом. И мне непонятно, почему результат этой обработки отличается в разных местах. Обратите внимание, про запуск плеера в документации тоже ничего нет. Представьте, что у вас обычная ОС (линукс или винда) работая в виртуалке начнет по нажатиям клавиш запускать непредсказуемые программы. Это вас удивит?
Запуск медиа плеера? Так их может быть сколько угодно используейте IntentChooser. Можно и стандартный запустить, но не факт что он будет на другом телефоне.

Если это не офф апи, то и расчитывать на то что оно будет одинаково работать на железе, явно не стоит. В офф блоге уже не раз об этом писали
Вы не поняли. Мне как раз не надо, чтобы он запускался, мне нужно ответить на звонок (как это происходит на настоящем телефоне). А он запускается. На свежесозданном девайсе в эмуляторе. Где ничего не устанавливалось и не изменялось. Голый android 2.2.
Сложно сказать, что вы делаете не так. Да еще при использовании закрытого апи и хаков.

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

Просто мне не нравится, что такая ситуация вообще возможна — это я и имел в виду, говоря об убогости средств разработки.
> это я и имел в виду, говоря об убогости средств разработки.

ну бред же, уж извините.
Ага, протестируйте мне там Google Calendar…
Опять же, API для Google Calendar официально не документирован.
Взять полноценный эмулятор, со всеми маркетами/календарями и тд?
По всей видимости можно, даже прям совсем плясок не надо будет, но не удобно, я и так еле-еле пару часов в неделю наскребаю покодить, а тут ещё время надо =\
Тогда к чему ваш пост был?
Нет времени не занимайтесь.
Интересно учлышать о «во имя безопасности». А скажите, в iOS разве с этим попроще? Или там можно взять так и заюзать private API?
По средствам разработки: не нравится Eclipse, берите IntelliJ IDEA или NetBeans. Знаю человека, который вообще небольшой свой android-проект в vim'е написал
Вот даже не знаю, как теперь ответить всем минусующим сразу и чтобы не повторять по десять раз одно и то же. Отвечу здесь.

Во-первых, эклипс я, конечно, с трудом перевариваю. За идею спасибо, посмотрю. Но дело не в них, а в самом эмуляторе, который поддерживает очень ограниченный набор функций по сравнению с реальным устройством (например, гарнитуру на эмуляторе вы не протестируете). А то, что поддерживается, иногда работает совсем не так, как на реальном железе. Получается, сначала тратишь кучу времени, чтобы обойти ограничения API и добиться какого-то результата в эмуляторе, а потом начинаешь всю борьбу сначала на девайсе. Сейчас приведу пример.

Теперь про «во имя безопасности». Не знаю, как с этим обстоит в iOS. Но закрывать на телефоне (а андроид делался, прежде всего, под телефоны) функции работы с этим самым телефоном — не слишком правильное решение, на мой взгляд. Теперь обещанный пример. Если поискать в гугле способ ответить программно на входящий звонок, то окажется, что официально это невозможно. Не предусмотрено в API. Есть обходной путь — эмулировать нажатие кнопки на гарнитуре. И тут как раз оказывается, что эмулятор и железяка обрабатывают это сообщение совсем по-разному. Я недавно задавал вопрос по этому поводу в Q&A, ответа не дождался, но успел кое-что выяснить сам. Если интересно, можете найти вопрос и посмотреть подробнее.

А урезан в андроиде далеко не только телефонный API. Многие вещи, кажущиеся логичными, сделаны совершенно странно. Например, есть сообщение о подключении гарнитуры. Но оно посылается только при подключении проводного устройства. Для bluetooth извольте слушать совсем другое сообщение. Аналогично и с простой проверкой того, подключена гарнитура или нет.

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

Вот это я и называю убогостью средств разработки и ограничением функций «во имя безопасности». Хотя поначалу мне самому очень понравилась идеология API андроида.
Лично мне кажется, что если позволять всем приложениям делать все, что они захотят — то это получится WM6 какой-то. Но тут мнения конечно расходятся.

По поводу эмулятора — как раз он и является «эталоном» работы Андроида. Если на девайсе работает не так, значит неправильно сделано на нем.

Свежий пример: есть такой баг в Samsung Galaxy (вероятно в каких-то прошивках) — когда вызываешь камеру (ACTION_CAPTURE_IMAGE), то он возвращает Intent = null, вместо Url к сфотканой картинке или data с самой картинкой. А это кстати документированная возможность.
И таких багов в разных девайсах — стотыщ. Потому что каждый производитель норовит переписать на что-то свое, вместо того, чтобы добавить.
Еще пример: в MIUI падает камера, когда запрашиваешь кроп фотки. И это все нужно учитывать.

А то, что у вас девайс неправильно кнопку обрабатывает — так это его проблемы, вы на других проверьте на всякий случай.
В том-то и дело, что на эмуляторе ни гарнитурную кнопку, ни подключение гарнитуры вообще нельзя изобразить. Отлаживал я через другие события (подключение питания, кажется, вместо гарнитуры). Так что эмулятор в данном случае нельзя назвать эталоном. А на реальных устройствах оно есть и работает, только на разных по-разному.
Это ты конечно загнул про средства разработки… Одна Intellij Idea CE 10.0.1 чего стоит. Да и сама платформа Андройда только улучшается.
Я говорил не про IDE, а про эмулятор. Чуть выше написал. Кстати, на линуксе у меня этот эмулятор так и не запустился. Проблема известная, решения, насколько я знаю, пока нет.
Да ну, как же так? Как же он у меня работает на линуксе, вот уже полтора года? Загадка…
Не у всех эта проблема есть, но, судя по гуглю, встречается достаточно часто, чтобы авторам стоило озаботиться решением.
Запускал минимум на 5 разных компах/ноутбуках, ос (lin/win/mac), все ок. Может у вас что то с компом?
Ну попробуйте погуглить что-нибудь типа «android linux emulator hangs». Там будут и обсуждения на форумах, и андроидовский багтрекер, и еще много чего. Не только моя это проблема. А с компом у меня все нормально, других жалоб на него нет. :) И под виндой тот же эмулятор нормально запускается (только медленно очень).
Не нашел ничего особенного.
Так что за конфигурация, если даже на винде очень медленно запускается.
А у вас эмулятор стартует мнгновенно? У меня в линуксе грузится примерно пару минут. Другой вопрос что загрузить его достаточно только один раз, а потом просто загружать в него свежие сборки приложения, что делется практически мнгновенно.
А должен мгновенно? Это же эмулятор.
Если дексы уже собраны (то есть это не первый запуск), то обычно секунд 30-35 на запуск.
Это разные конфигурации. На винде, в принципе, терпимо — там комп поновее, хотя тоже заметны тормоза. А линукс на стареньком ноуте, который, конечно, и не должен летать. Но эмулятор там не просто тормозит, а виснет наглухо. Кстати, похоже, это не только под линуксом встречается. Вот примеры жалоб, так что это не только моя проблема:

stackoverflow.com/questions/3103736/android-emulator-hanging-on-startup
stackoverflow.com/questions/2790772/android-virtual-device-freezing-during-its-loading
stackoverflow.com/questions/3959101/android-emulator-hangs-up
2 из 3 ссылки, что вы привели, связаны с билдом кастомного эмулятора. Мы же рассматриваем дефолтный в СДК.

Возможно надо использовать комп помощнее чем телефоны на андроиде.
Про дефолтный я тоже находил достаточно много, пока пытался побороть свой. Некоторым помогал совет запускать без поддержки аудио. У меня (и у многих других) это не сработало.

Комп не настолько убитый, чтобы эмулятор совсем не смог запуститься (P4 2.8GHz). Собственно, он и запускается, показывает гордую переливающуюся надпись «андроид» и перестает реагировать на внешние раздражители.
Как вариант можно посмотреть логи.
Но что то мне подсказывает проблема в старом компе (6-7лет?).

На стареньком макбуке Core Duo 2HGz, все нормально, на ноутбуке Lenovo 1,8Ghz, тоже все в порядке.
В логах ничего путного не видно. Последние строки такие:


I/ActivityManager( 60): Start proc android.process.acore for broadcast com.android.providers.contacts/.ContactsUpgradeReceiver: pid=104 uid=10000 gids={3003, 1015}

W/ActivityManager( 60): Process ProcessRecord{43f79718 104:android.process.acore/10000} failed to attach

I/Process ( 60): Sending signal. PID: 104 SIG: 9

W/ActivityManager( 60): Unattached app died before broadcast acknowledged, skipping

После этого ничего не происходит. Есть идеи почему?
Без понятия, причин может быть сколько угодно.

Попробуйте на другом компе. Возможно причина в вашем компе.
Вы можете написать любого вида настройки, было бы желание. И делается это достаточно легко.
Есть ли стандартный способ показывать текущее значение настройки в summary, как в дефолтном приложении настроек телефона? Или нужно после каждого изменения ручками ставить?
Видимо только руками, как описывают в оветах на этот вопрос.
во всех «хавту» как-то скромно обходится — как добавить в список сгенерированные значения, а не готовый массив… для чайника как раз понятно, как готовый список вставить, пример посмотрел и все
я заполнял список списком :) установленных программ, может пригодится кому-то — fat-hamster.blogspot.com/2010/11/android-widget-part-01.html
Одно замечание к коду, не используйте табуляцию при форматировании. 4 пробела достаточно, и выглядеть будет все нормально. Сейчас у вас видимо 8.

Вот кстати вчера тема была про оформление кода:
habrahabr.ru/blogs/android_development/112042/
Скорее всего у него как раз табы :)
Код — копипаста из оригинальной статьи.
Раз уж постите, будьте добры озаботиться нормальным форматированием.
Еще preferences очень удобно использовать для одноразовых диалогов\уведомлений. Показал диалог и положил через едитор true с идентификатором диалога. Что-то типо

Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putBoolean(DIALOG_RECENT_CHANGES, true);
editor.commit();

потом просто проверять на этот флаг.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории