Показаны сообщения с ярлыком Мобильная связь. Показать все сообщения
Показаны сообщения с ярлыком Мобильная связь. Показать все сообщения

понедельник, 2 июля 2012 г.

Samsung I9103 Galaxy R

В начале 2012 года поступил в продажу Samsung I9100 Galaxy R. Относится к классу смартфонов. Вес сравнительно небольшой – 114 грамм. Размер дисплея: 4.2" Super Clear LCD (480x800 точек), 16.7 млн. цветов/сенсорный, стойкий к царапанью. Стандарт: GSM (850/900/1800/1900 МГц), UMTS 900/2100. Аккумулятор: Li-ion 1650 мАч, время работы без подзарядки - около 6 часов в активном режиме. Пластиковое покрытие. 

Поддержка аудио форматов: MP3/WAV/eAAC+.

Поддержка видео форматов: MP4/DivX/XviD/WMV/H.264/H.263, Adobe Flash.

Предустановленные приложения: Google Search, Maps, Gmail, YouTube, Calendar, Google Talk, Picasa, редактор документов (Word, Excel, PowerPoint, PDF).

Приблизительная цена 469.00 $

Подробная информация:

Память :

1024 МБ оперативной памяти;

Встроенная 8ГБ;

Flash (microSD до 32 Гб).

Коммуникационные возможности:

EDGE/GPRS ;

HSDPA 7.2Mbps;

Wi-Fi 802.11 b/g/n, DLNA ;

Разъем 3,5 мм.;

Bluetooth 3.0+HS (A2DP);

USB 2.0.

Размеры:

Толщина – 9.5 мм.;

Ширина – 125 мм.;

Длина – 66 мм.;

Вес 135г.



Процессор:

Двухъядерный ARM Cortex-A9 (1.2 ГГц);

GeForce, чипсет Tegra 2.

Камера:

Фото 2592x1944 точек;

Видео 1280х720 точек;

Видеозапись HD-видео (720p);

Количество мегапикселей - 5 Мп;

Цифровой зум ;

Автофокус.

Кстати, если вас интересует миксер киев, то по ссылке вы найдете огромный выбор этих девайсов, на любой вкус и кошелек.

четверг, 4 августа 2011 г.

Почем нынче Google Voice

Я искренне благодарен великому богу по имени Интернет. Я теперь могу обмениваться мгновенными сообщениями с людьми находящимися за тысячи километров, здесь могу скачать бесплатно понравившуюся книгу, а с сайта разработчика установить свежие версии программ или всей системы.   А теперь еще его святейшество Гугл дал нам, грешным, голосовой и видеочат. Но за все надо платить. Вот я и заинтересовался - сколько...Выделение_0509.jpeg
Как вы уже догадались, я продолжаю ковыряться в обрушившемся на меня сервисе Google Voice. Ознакомившись с прейскурантом заметил, что в очень уж привилегированном положении оказались жители США и Канады, так как они могут звонить по всему миру бесплатно. Правда и вам привалило счастье. Если вы решите поболтать по Google Voice c американцами или канадцами то минута будет стоить 1 евроцент. То есть меньше американского цента.

Выделение_0510.jpeg
А тарифы для Украины меня очень огорчили. Я пока так и не понял, почему они такие высокие. А еще не ясно, с чего это вдруг выделили Киев и Львов, если тарифы одинаковые для всей страны, при звонках на стационарные телефоны.
Выделение_0511.jpeg
А еще не ясно, почему тарифы для России гораздо ниже чем для Украины.
Выделение_0512.jpeg
Ну и наконец небольшой, но тяжелый подводный камень. К стоимости разговора вам добавят НДС, действующий в вашей стране. В Украине это 20%. Точнее, НДС будет с вас сниматься при пополнении счета.
А еще хочу напомнить, что на самом деле выгодне всего общаться в глсовм гугло-чате между двумя гуглочеловеками.  Платишь только за Интернет.

вторник, 15 февраля 2011 г.

Социальная сеть вмонтируется в SIM-карты наших телефонов?

Современные вэб-сервися позволяют почти все - и прикольное оформление ваших фотографий, и ведение собственных дневников, и обмен мгновенными сообщениями, и целые социальные сети. Причем, именно социальные сети сегодня становятся неотъемлемой частью большинства программных комплексов для компьютерных устройств. Причем сейчас производители техники стараются "зашить" эти сервисы даже в мобильные телефоны.

В частности, компания Gemalto представила на проходящей сейчас выставке MobileWorld Congress новый способ доступа к Facebook. Он работает на любой модели телефона. Причем сервис работает даже в том случае, если у конкретной модели нету доступа в Интернет, или он не активирован.

Новое решение называется Facebook for SIM, и заключается в том, что компания интегрировала необходимое программное обеспечение для работы с сайтом непосредственном в SIM-карту, на 100% совместимую со всеми моделями телефонов. Это технологическое решение предоставляет доступ к базовым функциям сайта: запрос на добавление в друзья, обновление статуса, создание записей на стене, и отправка личных сообщений.

Учтите, что для использования Facebook for SIM вам не потребуется дополнительное ПО или доступ в Интернет, поскольку все необходимые программные составляющие уже хранятся в SIM-карте, а работа с сайтом происходит через SMS-сообщения. Но есть и ложка дегтя. Facebook for SIM будет бесплатен в течение некоторого ознакомительного периода, после чего пользователю будет предложено перейти на подписку.

вторник, 14 июля 2009 г.

Нехилый список ресурсов по Nokia

Наткнулся на нехилый список ресурсов по Nokia. У меня как-раз N78. Прикапываю.. :)
http://allnokia.ru/ - клуб любителей смартфонов и телефонов nokia
http://mobiguru.ru/phones/nokia/ - цены на телефоны nokia, всё для мобильных телефонов нокиа: темы, игры, мелодии, картинки
http://www.nokia-n.org/ - мобильные телефоны nokia "N" серии | nokia n95 | nokia n73 | nokia n70 | nokia n72 | nokia n80 | nokia n76 | nokia...
http://www.colornokia.com/ - всё для мобильных телефонов nokia! клуб владельцев nokia
http://www.nokia-mobile.org/ - клуб любителей телефонов и смартфонов nokia
http://www.difc.ru/ - nokia - сотовые телефоны и аксессуары
http://www.nokia-mobi.org/ - сайт о нокиа, программы для нокиа, игры для нокиа, прошивки для нокиа
http://helpix.ru/nokia/ - nokia - мобильные телефоны - образы, тексты, описание, мнения пользователей
http://www.003.ru/list/3000/1.html?brand... -мобильные телефоны нокиа, купить телефон нокиа в 003.Ru
http://mnovosti.ru/nokia.html - мобильные новости. всё для нокиа - телефоны смартфоны PDA (КПК) нокиа
http://optium.ru/phones/nokia - телефоны нокиа - интернет магазин OPTium.ru - продажа оптом
http://tonez.net.ru/nokia.php - бесплаиные мелодии для нокия
[ссылка появится после проверки модератором] - описание, характеристика, фотографии, сравнения, цены - нокиа
http://www.sotmarket.ru/category/mobiles... -нокиа, нокиа скачать, телефоны нокиа, нокиа программы....
http://koala.com.ua/ - интернет магазин KOALA
http://www.themobil.ru/ - мобильные технологии - программы, игры, темы для Symbian
http://os9.ru/ - всё для смартфонов нокиа
http://iphon.ru/ - все самые последние новинки мобильных телефонов и аксессуаров
http://worldnokia.ru/ - мир нокиа, всё для нокиа
http://www.mobillaz.ru/nokia - интернет магазин Mobillaz
http://www.nokia-world.ru/ - новости
http://mnokia.ru/ - каталог, игры ява, мелодии, темы на мобильный - нокиа
[ссылка появится после проверки модератором] - всё для нокиа
http://mobil.odvd.ru/ - анимированные темы для нокиа
http://mymobila.org/ - моя мобила, всё для сотовых
http://www.alliance.com.ua/category/noki... -программы и игры для нокиа, новости
http://www.nokia.bir.ru/ - программы для наших смартфонов нокиа
http://www.nokia-clubs.org/ - клуб, игры, софт, программы для нокиа
счастливо найти нужную информацию, желаю успехов))

понедельник, 13 июля 2009 г.

Symbian OS станет открытой

Организация Symbian Foundation выпустила свой первый продукт с открытым исходным кодом, сделав первый шаг на пути к полному открытию системы Symbian под лицензией EPL (Eclipse Public License).

Эта организация была основана в июне 2008 компаниями Nokia, Motorola, Sony Ericsson, NTT DoCoMo, Texas Instruments, Vodafone, Samsung, LG и AT&T с целью планирования разработки открытой платформы Symbian.

На этом этапе был открыт пакет "OS Security Package", демонстрируя серьезные намерения организации в отношении к дальнейшему открытию исходных кодов платформы. На следующем этапе планируется открытие ядра системы и базового набора компонентов и драйверов.

По словам Даниела Рубио, главного архитектора платформы Symbian, "такой набор компонентов в дальнейшем позволит получить полный доступ к устройству благодаря пакету поддержки платформы и свободному toolchain. Все это будет доступно в ближайшие три месяца."

пятница, 5 июня 2009 г.

Линукс мобайл или Моблин, повелитель нетбуков

Сегодня много разговоров вокруг Moblin, но многие до конца не понимают, что же это такое. Советую прочесть приведенную ниже статью, чтобы прояснить ситуацию. Оригинал статьи находится здесь - Knoppix.ru/050609.shtml

За добрых десять лет знакомства с Linux автор этих строк вывел для себя шутливое эмпирическое правило: каждый год свободная ОС неизменно преподносит приятный сюрприз. Меняются интерфейсы, появляются новые форматы данных, от релиза к релизу становится проще установка и настройка дистрибутивов (я веду тетрадку, в которой, чтобы не забыть, записываю ход инсталляции каждого релиза Debian — и последнему, 5.0 Lenny, там посвящено лишь несколько строчек). А фантазия разработчиков и пользователей поднимает систему всё выше. Не стал исключением и год нынешний, подаривший замечательную новинку под названием Moblin. Расшифровка очевидна: Moblin — сокращение от Mobile Linux, мобильного Линукса. В июле проект будет праздновать второй день рождения, однако до сих пор Moblin был известен лишь сравнительно узкому кругу девелоперов. Всё изменилось буквально на днях, с выходом бета-версии релиза номер 2. Moblin сегодня — сверхновая звезда, которой уже прочат место самого популярного мобильного дистрибутива Linux.

Официальный логотип Moblin

Родился Moblin в стенах корпорации Intel летом 2007 года. Тогда микропроцессорный гигант ещё только готовил к выходу на рынок сверхэкономичный процессор Atom. «Атомное» железо должно было стать основой для разного рода портативных цифровых устройств с выходом в Сеть — нетбуков, неттопов, ультрамобильных PC и всего, что подпадает под популярное определение мобильного интернет-девайса (Mobile Internet Device, MID). А Moblin — операционной системой, способной полноценно управлять такими компьютерами. Так всё и получилось: суперсовременные нетбуки, представленные на открывшейся вчера в Тайпее выставке Computex, почти поголовно содержат процессоры Atom и управляются Моблин'ом. Забегая вперёд скажу, что поставить Moblin на свой нетбук можете и вы: проект свободен и «живая» версия дистрибутива доступна с официального сайта разработчиков.

Рабочий стол Moblin

Впрочем, довольно маркетинга. Задача, которую поставили перед собой создатели Moblin, без преувеличения амбициозна. Им виделся вариант Linux, оснащённый неким оригинальным интерфейсом, предоставляющим в распоряжение пользователя все функции портативного устройства, способный загружаться в считанные секунды и при всём этом сохранивший максимальную совместимость с рядовыми Линукс-дистрибутивами, работающими на обычных персоналках. Базовым кирпичиком стало стандартное ядро Linux, из которого исключили все лишние — для мобильного устройства — компоненты. Пользовательский интерфейс пришлось разработать с нуля: в альфа-версиях Moblin рабочим столом управлял всем известный XFCE, но в последнем релизе, Moblin 2 бета, его заменила оригинальная графическая среда, построенная на суперсовременном движке Clutter (он же используется в Линуксах, управляющих устройствами от Nokia и Palm). Clutter позволяет делать очень быстрые и красивые, насыщенные визуальными эффектами интерфейсы, активно используя OpenGL. Что касается прочих системных функций Moblin, то и они реализованы с привлечением свободных, хорошо зарекомендовавших себя программ. Так, окна рисует стандартный сервер Xorg, моблиновский браузер выполнен на HTML-движке Gecko (сердце Mozilla Firefox), пейджинговые функции возложены на Empathy (входит в состав Gnome), органайзерские обязанности исполняет Pimlico (доступен и на других мобильных линуксовых платформах, см. pimlico-project.org), поиск контента на близлежащих устройствах реализован с привлечением стандартного механизма UpnP и т.п.

Таким образом, формально, Moblin не является наследником какого-то одного дистрибутива Linux, представляя собой новый, самостоятельный вариант свободной операционной системы. Фактически же, благодаря тому, что составлен он из уже существующих компонент, Moblin совместим с обычными десктоп-дистрибутивами. Это означает, во-первых, что в него можно легко перенести любую программу, написанную для Linux, и, во-вторых, если у вас уже был опыт работы с Линуксом, в Моблин'е вы будете чувствовать себя как дома.

Архитектура Moblin

Такова системная изнанка нового проекта. Что касается внешности — судите сами, иллюстрируют эту заметку скриншоты последней версии Moblin. Получилась информативная, мультимедийная, готовая к полноценной работе в локальных сетях и глобальной Сети, чрезвычайно лёгкая среда (загрузка отнимает менее 5 секунд). По умолчанию на экране отображена комбинация живых графических миниатюр, представляющих важнейшие для пользователя_на_ходу сведения: актуальные записи из органайзера, ссылки на недавно открывавшиеся документы, статусы друзей из Twitter и других социальных сетей. Нажатие схематичных иконок в верхней части экрана вызывает спускающуюся панель, в которой можно выполнять определённые задачи. Плюс, весь пользовательский интерфейс пронизан оригинальными дизайнерскими решениями, облегчающими пользование устройством с ограниченными возможностями.

Как уже отмечалось, Moblin — свободный проект, исходные тексты его опубликованы под лицензией семейства GPL. Родство с Intel тоже ни к чему не обязывает: микропроцессорный гигант, руководивший работами первые год с небольшим, к настоящему моменту передал бразды правления промышленному консорциуму Linux Foundation. Попробовать Moblin очень просто: скачайте образ дистрибутива с официального сайта (чуть меньше 700 Мбайт), «прошейте» на CD или флэшку, и перезагрузите компьютер с прошитого носителя (подробные инструкции на moblin.org/documentation). Единственное, о чём следует помнить, ваша персоналка должна содержать либо микропроцессор Atom, либо графический чипсет на процессоре Intel. В списке протестированных компьютеров пока в основном нетбуки: Acer Aspire One, Asus eeePC, Dell Mini, MSI Wind, микромашинки от Lenovo, Samsung и HP. Все желающие могут принять участие в разработке дистрибутива, или как минимум сообщать о багах http://bugzilla.moblin.org.

Рабочий стол Moblin

Рассказав про Moblin, нельзя не упомянуть и о параллельных разработках. Список линукс-дистрибутивов, заточенных под нетбуки, пополняется регулярно и уже сегодня в нём больше десятка наименований. Это Eeebuntu и Eeedora, TinyMe и gOS, многие другие. Однако, в отличие от конкурентов, как правило имеющих «дурную наследственность» (большинство нетбуковых дистрибутивов отпочковались от крупных проектов вроде Ubuntu Linux и, соответственно, «помнят» о своём десктоповом прошлом), Moblin написан с нуля, что делает его непревзойдённо быстрым. Другой шустрый конкурент, выросший в лабораториях Google проект Android, к сожалению, слишком облегчён, так что перенос на него существующих линуксовых программ представляет непростую задачу. Moblin лишён и этого недостатка. Неудивительно, что западная пресса носит Moblin на руках, рисуя ему самые светлые перспективы. Впрочем, попробуйте сами — Моблин того стоит!

------------------------------------------------------------------------------------------------------------

Делаете ремонт? Тогда вам будет интересно узнать, какие
цены на гипсокартон в Киеве. Кроме того, советую ознакомиться, где можно купить современные двери, а заодно выбрать подходящую модель.

среда, 3 июня 2009 г.

Ждем iPhone N2 от китайцев!

Китайцы не перестают удивлять своей расторопностью! Ведь ажиотаж перед выходом новой версии iPhone постепенно приближается к своей кульминации. Этим и воспользовались китайские производители, выпустившие очередной клон iPhone и назвавшие его iPhone N2.

На сей раз китайцы не стали с точностью копировать внешность iPhone. Более того, они немного ее изменили в надежде, что iPhone N2 будут принимать за новую версию популярного гаджета.

iPhone N2 предназначен для использования в сетях GSM (850/900/1800/1900 МГц). Он может предложить пользователям 3,5-дюймовый сенсорный дисплей с разрешением 320 х 480 пикселей, отображающий до 260 тысяч цветов, 5-мегапиксельную камеру, Bluetooth-модуль с поддержкой стереопрофиля A2DP, аналоговый TV-тюнер с поддержкой SECAM/PAL/NTSC, FM-тюнер, медиаплеер и слот для карт памяти MicroSD.

Размеры телефона 115 х 63 х 10,1 миллиметров.

Литий-ионного аккумулятора iPhone N2 емкостью 1 200 мАч хватит на 3-5 часов работы в режиме разговора и 120-220 часов работы в режиме ожидания.

В комплекте с телефоном поставляется карта памяти емкостью 2 гигабайта.

iPhone N2 уже появился в продаже на eBay. Цена вопроса — 148 долларов.

Кстати, все те, кто считает, что знаменитый интернет-аукцион это нечто далекое, ограниченное расстоянием и языковым барьером, сильно ошибаются!Существуют посредники на eBay, которые обеспечат правильную покупку и быструю доставку товара прямо в ваш дом или офис.


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

воскресенье, 26 апреля 2009 г.

Пощупал Nokia 5800 XpressMusic

Недавно, а именно в канун Нового года, я прощелкал свой смартфон. Причем примерно в это же время моя кума тоже лишилась аппарата. Мы еще горько друг-другу на жизно жаловались. Естсесвенно, что жить без связи долго нельзя. Я купил себе Нокию N78. А вчера был повод поглазеть на обновку родственницы, ибо был у нее на дне рождения. И она меня удивила, так как прикупила нашумевший аппарат Nokia 5800 XpressMusic. Вещь конечно интересная, не спорю. Впечатляет и характеристиками и дизайном. Вот только сенсорное управление слегка поставило в тупик. Хотя, конечно понимаю, что это дело привычки.

среда, 8 апреля 2009 г.

Дистрибутив для КПК и коммуникаторов

Похоже Linux постепенно завоевывает все новые пространства и сферы, в которых ранее доменировали закрытые програмные решения. Это касается различных мобильных устройств, кпк, смартфонов и коммуникаторов. Не секрет, что например коммуникатор, это безраздельная вотчина мобильной версии Windows. Однако на этот рыном постепенно проберается и Linux.

Довольно интересное предложение сделала итальянская компания Koan Software, начав свободное распространение Linux дистрибутива KaeilOS 4.0 (Koan Advanced Industrial Embedded Linux Operating System). Он создан для использования на встраиваемой технике, мобильных устройствах, КПК и телефонах. Занимательно, что ранее дистрибутив распространявшийся по цене 300 евро, теперь переведен с системы сборки KTXdist на основу OpenEmbedded и доступен в исходных текстах под лицензией GPL.

Если верить заявлениям разработчиков, дистрибутив базируется на real-time расширениях к Linux ядру RTAI и уже используется в системах промышленной автоматизации, автомобильных системах диагностики, медицинских приборах и военной технике. При этом KaeilOS легко адаптируется как для обычных ПК, так и для устройств с ограниченными ресурсами, поддерживает довольно много процессоров, совместимых с архитектурами x86 и ARM. Кстати, дистрибутив поддерживает установку на телефон OpenMoko FreeRunner и планшетный ПК Nokia N800 / N810.

вторник, 17 марта 2009 г.

Обзор Jabber-клиентов для мобильных телефонов с поддержкой Java (J2ME)

Обзор Jabber-клиентов для мобильных телефонов с поддержкой Java (J2ME) / Jabber / Хабрахабр

В последние время многие решили перейти на Jabber. И тут же возникает вопрос какой Jabber клиент выбрать для мобильного телефона? Не так давно был обзор существующих решений для Symbian 9. К сожалению, смартфоны есть не у всех — поэтому представляю краткий обзор Jabber-клиентов для мобильных телефонов с поддержкой Java.

Talkonaut


Talkonaut- это бесплатный Jabber IM клиент с поддержкой VoIP(в Java версии осуществляется через Callback), также позволяет обмениваться текстовыми сообщениями с пользователями сетей MSN, Yahoo, ICQ и AIM. Есть поддержка конференций, передача файлов, компрессия трафика (Zlib). Из минусов можно отметить отсуствие истории.
Разработчиками являются Евгений Короленко и Руслан Залата из Тюмени.

image

Bombus


Bombus — Jabber-клиент для мобильных устройств. Из возможностей следует отметить регистрация и управление неограниченным количеством Jabber-аккаунтов; добавлять пользователей в игнор-лист, списки приватности, просмотр и редактирование vCard, установка приоритетов и статус сообщений, сохранение истории, компрессия трафика (Zlib). Также среди функций есть поддержка конференций, удалённое управление Jabber-клиентами, передача файлов. В качестве оповещения можно выставить звук, вибровызов и световую индикацию.

Помимо Bombus существует Bombusmod
Список отличий BombusMod:
  • Шаблоны.
  • Ping (xep-0199), client-client.
  • Сохранение и загрузка настроек на сервере.
  • Транслитерация отправляемого сообщения.
  • Сохранение фото из vcard.
  • Возможность установить статус «по умолчанию» при подключении.
  • Расширен диапазон keepAlive (10…2096).
  • Таймаут реконнекта увеличен с 5 до 30 секунд.
  • Копирование данных из «info»(jid, status, seen, idle, online, time, vcard).
  • Seen, idle, online для всех контактов.
  • Уведомление о просмотре version/idle/time в ростере в виде значка.
  • Удаление и переименование групп.
  • Автостатус «Недоступен» после двойного времени «Отсутствую».
  • Графическое меню.
  • Настройка цветов (цвет схемы).
  • Антиспам для приватов конференции.

Bombus является самым лучшим из всех существующих клиентов для мобильных телефонов J2ME.
На официальном сайте реализован конструктор с помощью которого можно сделать индивидуальную сборку для себя.

image

Nimbuzz


Nimbuzz — IM клиент позволяет общаться с пользователями сетей Jabber, ICQ, Google Talk, Skype, MSN/Windows Live messenger, Yahoo, AIM, Gadu-Gadu, Twitter, MySpace, Facebook, Hyves. Клиент позволяет вам видеть статус и местоположение собеседника, оставлять голосовые и текстовые сообщения, передавать файлы, бэкап телефонной книги. Из недостатков нет истории сообщений, нет jabber-конференций.

image

Jimm aspro (Jabber)


Jimm aspro — основан на коде Jimm'a. Проект только начал своё развитие, поэтому еще находится в стадии бета, но достаточно быстро развивается. Нету возможности зарегистрировать аккаунт, просматривать инфу о контактах, клиентах, не удобный вход в конференции.

image

Также существуют и другие jabber-клиенты для мобильных c поддержкой J2ME, но они малофункциональны или не поддерживаются разработчиками, например:
MGTalk — jabber-клиент с поддержкой некоторых функций Google Talk. Групп нет, тормозит при вводе текста, конференций нет. Последняя версия 2006 года.
miniFring — IM клиент c Skype, ICQ, Google Talk, MSN Messenger, Twitter, Yahoo, AIM. Нет групп, нельзя смотреть инфу контакта, нет поддержки конференций, нельзя настроить соединение с произвольным сервером — только Google Talk.

воскресенье, 26 октября 2008 г.

Знакомство с Android. Часть 4: Использование GridView

Somethings: Знакомство с Android. Часть 4: Использование GridView

Итак, в нашем приложении осталось всего ничего: реализовать собственно алгоритм игры Life и отобразить его в GridView. Этим-то мы сейчас и займёмся.

Класс, реализующий логику Life

Добавим в проект новый класс, назовем его LifeModel. Тут у нас будет реализована вся логика Life

package com.android.life;  import java.util.Random; public class LifeModel {   // состояния клетки   private static final Byte CELL_ALIVE = 1; // клетка жива   private static final Byte CELL_DEAD = 0; // клетки нет      // константы для количества соседей   private static final Byte NEIGHBOURS_MIN = 2; // минимальное число соседей для живой клетки   private static final Byte NEIGHBOURS_MAX = 3; // максимальное число соседей для живой клетки   private static final Byte NEIGHBOURS_BORN = 3; // необходимое число соседей для рождения клетки      private static int mCols; // количество столбцов на карте   private static int mRows; // количество строк на карте   private Byte[][] mCells; // расположение очередного поколения на карте.               //Каждая ячейка может содержать либо CELL_ACTIVE, либо CELL_DEAD      /**   * Конструктор   */   public LifeModel(int rows, int cols, int cellsNumber)   {     mCols = cols;     mRows = rows;     mCells = new Byte[mRows][mCols];          initValues(cellsNumber);   }      /**   * Инициализация первого поколения случайным образом   * @param cellsNumber количество клеток в первом поколении   */   private void initValues(int cellsNumber)   {     for (int i = 0; i < mRows; ++i)       for (int j = 0; j < mCols; ++j)         mCells[i][j] = CELL_DEAD;          Random rnd = new Random(System.currentTimeMillis());     for (int i = 0; i < cellsNumber; ++i)     {       int cc;       int cr;       do       {         cc = rnd.nextInt(mCols);         cr = rnd.nextInt(mRows);       }       while (isCellAlive(cr, cc));       mCells[cr][cc] = CELL_ALIVE;                   }   }      /**   * Переход к следующему поколению   */   public void next()   {     Byte[][] tmp = new Byte[mRows][mCols];          // цикл по всем клеткам     for (int i = 0; i < mRows; ++i)       for (int j = 0; j < mCols; ++j)       {         // вычисляем количество соседей для каждой клетки         int n =           itemAt(i-1, j-1) + itemAt(i-1, j) + itemAt(i-1, j+1) +           itemAt(i, j-1) + itemAt(i, j+1) +           itemAt(i+1, j-1) + itemAt(i+1, j) + itemAt(i+1, j+1);                  tmp[i][j] = mCells[i][j];         if (isCellAlive(i, j))         {           // если клетка жива, а соседей у нее недостаточно или слишком много, клетка умирает           if (n < NEIGHBOURS_MIN || n > NEIGHBOURS_MAX)             tmp[i][j] = CELL_DEAD;         }         else         {           // если у пустой клетки ровно столько соседей, сколько нужно, она оживает           if (n == NEIGHBOURS_BORN)             tmp[i][j] = CELL_ALIVE;                        }       }     mCells = tmp;   }      /**   * @return Размер поля   */   public int getCount()   {     return mCols * mRows;   }      /**   * @param row Номер строки   * @param col Номер столбца   * @return Значение ячейки, находящейся в указанной строке и указанном столбце   */   private Byte itemAt(int row, int col)   {     if (row < 0 || row >= mRows || col < 0 || col >= mCols)       return 0;            return mCells[row][col];   }      /**   * @param row Номер строки   * @param col Номер столбца   * @return Жива ли клетка, находящаяся в указанной строке и указанном столбце   */   public Boolean isCellAlive(int row, int col)   {     return itemAt(row, col) == CELL_ALIVE;   }    /**   * @param position Позиция (для клетки [row, col], вычисляется как row * mCols + col)   * @return Жива ли клетка, находящаяся в указанной позиции   */   public Boolean isCellAlive(int position)   {     int r = position / mCols;     int c = position % mCols;      return isCellAlive(r,c);   } } 

GridView. Отображение первого поколения клеток

Модифицируем разметку run.xml так, чтобы она выглядела следующим образом:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent">   <GridView     android:id="@+id/LifeGrid"     android:layout_width="fill_parent"     android:layout_height="wrap_content"          android:padding="1dp"     android:verticalSpacing="1dp"     android:horizontalSpacing="1dp"     android:columnWidth="10dp"      android:gravity="center"   /> 

  <Button     android:id="@+id/CloseButton"     android:text="@string/close"     android:textStyle="bold"     android:layout_width="wrap_content"     android:layout_height="wrap_content"   />

</LinearLayout>

Теперь нам надо отобразить в этом GridView данные. Думаю, вполне логичным для данной задачи было бы отображение клеток в виде графических файлов. Создаем два графических файлика, на одном изображаем черный квадратик, на другом - зелёный. Первый назовём empty.png и он будет обозначать пустую клетку, второй - cell.png, и он будет изображать живую клетку. Оба файлика положим в папку /res/drawable

Нам нужно знать, что именно отображать в гриде. Для этого нужно создать для грида поставщик данных (Adapter). Есть стандартные классы для адаптеров (ArrayAdapter и др.), но нам будет удобнее написать свой, унаследованный от BaseAdapter. Дабы не плодить файлов (да и не нужен он больше никому), поместим его внутрь класса RunScreen. А напишем там следующее:

public class LifeAdapter extends BaseAdapter {   private Context mContext;   private LifeModel mLifeModel;    public LifeAdapter(Context context, int cols, int rows, int cells)   {     mContext = context;     mLifeModel = new LifeModel(rows, cols, cells);   }    public void next()   {     mLifeModel.next();   }    /**   * Возвращает количество элементов в GridView   */   @Override   public int getCount()   {     return mLifeModel.getCount();   }    /**   * Возвращает объект, хранящийся под номером position   */   @Override   public Object getItem(int position)   {     return mLifeModel.isCellAlive(position);   }    /**   * Возвращает идентификатор элемента, хранящегося в под номером position   */   @Override   public long getItemId(int position)   {     return position;   }    /**   * Возвращает элемент управления, который будет выведен под номером position   */   @Override   public View getView(int position, View convertView, ViewGroup parent)   {     ImageView view; // выводиться у нас будет картинка          if (convertView == null)     {       view = new ImageView(mContext);        // задаем атрибуты       view.setLayoutParams(new GridView.LayoutParams(10, 10));       view.setAdjustViewBounds(false);       view.setScaleType(ImageView.ScaleType.CENTER_CROP);       view.setPadding(1, 1, 1, 1);     }     else     {       view = (ImageView)convertView;     }          // выводим черный квадратик, если клетка пустая, и зеленый, если она жива     view.setImageResource(mLifeModel.isCellAlive(position) ? R.drawable.cell : R.drawable.empty);          return view;   } } 

Теперь добавим в класс поля:

private GridView mLifeGrid; private LifeAdapter mAdapter; 
и модифицируем onCreate:

public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.run);      mCloseButton = (Button) findViewById(R.id.CloseButton);   mCloseButton.setOnClickListener(this);    Bundle extras = getIntent().getExtras();   int cols = extras.getInt(EXT_COLS);   int rows = extras.getInt(EXT_ROWS);   int cells = extras.getInt(EXT_CELLS); 

  mAdapter = new LifeAdapter(this, cols, rows, cells);      mLifeGrid = (GridView)findViewById(R.id.LifeGrid);   mLifeGrid.setAdapter(mAdapter);   mLifeGrid.setNumColumns(cols);   mLifeGrid.setEnabled(false);   mLifeGrid.setStretchMode(0);

}

Запускаем и видим:

Life для Android: первое поколение

Отображение последующих поколений

Вот мы и добрались почти до самого конца. Осталось отобразить ход игры. Тут стоит воспользоваться таймером. Таймер будет каждую секунду вызывать обработчик, в котором данные в адаптере будут пересчитываться. Сначала добавим в RunScreen поле:

private Timer mTimer; 
а в onCreate - такой код:
mTimer = new Timer("LifeTimer"); mTimer.scheduleAtFixedRate(new SendMessageTask(), 0, 500); 

SendMessageTask - это класс-обработчик таймера. Мы определим его прямо в классе RunScreen следующим образом:

public class SendMessageTask extends TimerTask {   /**   * @see java.util.TimerTask#run()   */   @Override   public void run()   {     Message m = new Message();     RunScreen.this.updateGridHandler.sendMessage(m);   } } 

В RunScreen же добавим такую конструкцию:

Handler updateGridHandler = new Handler() {   public void handleMessage(Message msg)   {     mAdapter.next();     mLifeGrid.setAdapter(mAdapter);      super.handleMessage(msg);   } }; 

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

Теперь, запустив Life, можно увидеть, например, следующее

Life для Android

Ссылки

Заключение

Итак, мы написали первое приложение для Android, которое уже и не совсем "Hello, World". Лично мне писать для Android понравилось куда больше, чем классические мидлеты. Остался, правда, ряд претензий к Eclipse, но, возможно, это от недостатка опыта.

Спасибо, если кто осилил. Замечания приветствуются.

Исходники примера

Автор: darja на 14:11

Знакомство с Android. Часть 3: Использование диалогов

Somethings: Знакомство с Android. Часть 3: Использование диалогов

В этой части мы сделаем проверку вводимых параметров по следующим правилам:

  • Число столбцов должно быть не меньше 5 и не больше 25.
  • Число строк должно быть не меньше 5 и не больше 35.
  • Начальное количество клеток должно быть не больше, чем ячеек на поле.

Если какое-то из этих условий не выполняется, будем выводить соответствующее предупреждение

Кроме того, мы добавим кнопку Close, при нажатии на которую приложение будет закрываться, спрашивая вначале согласие пользователя.

Простой диалог

Сначала добавим в класс StartScreen.java следующие константы:
// код результата проверки private static final int ALERT_NONE = 0; // параметры введены верно private static final int ALERT_COLUMNS = 1; // некорректное число столбцов private static final int ALERT_ROWS = 2; // некорректное число строк private static final int ALERT_CELLS = 3; // некорректное начальное число клеток  // границы допустимых значений числа столбцов private static final int COLUMNS_MIN = 5; private static final int COLUMNS_MAX = 25;  // границы допустимых значений числа строк private static final int ROWS_MIN = 5; private static final int ROWS_MAX = 35; 

Теперь добавляем метод, осуществляющий проверку введенных параметров:

private int checkInputParameters(int cols, int rows, int cells) {   if (cols < COLUMNS_MIN || cols > COLUMNS_MAX)   {     return ALERT_COLUMNS;   }      if (rows < ROWS_MIN || rows > ROWS_MAX)   {     return ALERT_ROWS;   }      if (cells > rows * cols)   {     return ALERT_CELLS;   }      return ALERT_NONE; } 

Метод onClick теперь должен работать немного по-другому: сначала проверять введенные параметры, и, если проверка прошла (ALERT_NONE), открывать окно RunScreen, иначе же показывать предупреждение. Итак, onClick будет выглядеть так:

public void onClick(View v) {   EditText rowsEditor = (EditText)findViewById(R.id.RowsEditor);   EditText colsEditor = (EditText)findViewById(R.id.ColumnsEditor);   EditText cellsEditor = (EditText)findViewById(R.id.CellsEditor);      int cols = Integer.parseInt(colsEditor.getText().toString());   int rows = Integer.parseInt(rowsEditor.getText().toString());   int cells = Integer.parseInt(cellsEditor.getText().toString()); 

  int alertCode = checkInputParameters(cols, rows, cells);   if (alertCode != ALERT_NONE)   {     showDialog(alertCode);     return;   }

  Intent intent = new Intent();   intent.setClass(this, RunScreen.class);      intent.putExtra(RunScreen.EXT_COLS, cols);   intent.putExtra(RunScreen.EXT_ROWS, rows);   intent.putExtra(RunScreen.EXT_CELLS, cells);   startActivity(intent);   finish(); }

Метод showDialog(id) класса Activity пытается открыть диалог. При этом вызывается метод onCreateDialog, возвращающий объект класса Dialog. Так что нужно перекрыть метод onCreateDialog и сконструировать тот диалог, который нам нужен. Ну у нас тут всё просто, диалоги будут отличаться только выводимым сообщением, так что можно сделать следующее:

@Override protected Dialog onCreateDialog(int id) {   DialogInterface.OnClickListener doNothing = new DialogInterface.OnClickListener()   {     public void onClick(DialogInterface dialog, int whichButton)     {     }   };   int alertMessage;      switch (id)   {     case ALERT_COLUMNS:       alertMessage = R.string.alert_columns;       break;     case ALERT_ROWS:       alertMessage = R.string.alert_rows;       break;     case ALERT_CELLS:       alertMessage = R.string.alert_cells;       break;     default:       return null;   }      return new AlertDialog.Builder(this)     .setMessage(alertMessage)     .setNeutralButton(R.string.ok, doNothing)     .create(); } 

В strings.xml при этом нужно добавить следующие значения:

<string name="alert_columns">Incorrect columns number: should be from 5 to 25</string> <string name="alert_rows">Incorrect rows number: should be from 5 to 35</string> <string name="alert_cells">Number of cells is greater then the size of grid</string> <string name="ok">OK</string> 

Итак, в методе onCreateDialog мы решили, какое сообщение (alertMessage) будем выводить, создали диалог с помощью AlertDialog.Builder, вывели туда сообщение, поставили единственную кнопку OK и привязали к ней обработчик doNothing, который ничего не делает (нам, в принципе, делать ничего и не надо). Аналогичным образом можно добавить иконку формы, добавить ещё кнопок и т.д.

Подробнее про то, как строятся диалоги, можно посмотреть в адроидовских сэмплах - там на самом деле все достаточно понятно и просто.

Теперь при вводе некорректных данных мы видим вот это:

Простейший диалог Android

Диалог для закрытия приложения

Добавим на форму RunScreen кнопку Close. Для этого напишем такую разметку в run.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent">   <TextView     android:id="@+id/Message"     android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:paddingBottom="10dip"   />   <Button     android:id="@+id/CloseButton"     android:text="@string/close"     android:textStyle="bold"     android:layout_width="wrap_content"     android:layout_height="wrap_content"   /> </LinearLayout> 

В strings.xml добавим следующие значения:

<string name="yes">yes</string> <string name="no">no</string> <string name="close">Close</string> <string name="submit_close">Are you sure you want to close this wonderful application?</string> 

Теперь вносим изменения в класс RunScreen:

public class RunScreen extends Activity implements OnClickListener { 

  private static final int ALERT_CLOSE = 1;   public static final String EXT_COLS = "cols";   public static final String EXT_ROWS = "rows";   public static final String EXT_CELLS = "cells";   

  Button mCloseButton;

  /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)   {     super.onCreate(savedInstanceState);     setContentView(R.layout.run);

    mCloseButton = (Button) findViewById(R.id.CloseButton);     mCloseButton.setOnClickListener(this);

    Bundle extras = getIntent().getExtras();     int cols = extras.getInt(EXT_COLS);     int rows = extras.getInt(EXT_ROWS);     int cells = extras.getInt(EXT_CELLS);     TextView message = (TextView)findViewById(R.id.Message);     message.setText("Rows: " + rows + "\nColumns: " + cols + "\nCells: " + cells);   }

  /*   * @see android.view.View.OnClickListener#onClick(android.view.View)   */   @Override   public void onClick(View arg0)   {     showDialog(ALERT_CLOSE);   }

  @Override   protected Dialog onCreateDialog(int id)   {     switch (id)     {       case ALERT_CLOSE:         return new AlertDialog.Builder(this)         .setMessage(R.string.submit_close)         // кнопка "Yes", при нажатии на которую приложение закроется         .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener()           {             public void onClick(DialogInterface dialog, int whichButton)             {               finish();             }           })         // кнопка "No", при нажатии на которую ничего не произойдет         .setNegativeButton(R.string.no, new DialogInterface.OnClickListener()           {             public void onClick(DialogInterface dialog, int whichButton)             {                            }           })         .create();       default:         break;     }     return null;   }

}

Объяснять тут особо нечего, и так все понятно. Теперь, при нажатии на кнопку Close, мы видим следующее:

Диалог Android

При нажатии на yes приложение закроется, на no - продолжит работу.

Ссылки

Исходники примера

Знакомство с Android. Часть 2: Переходы между формами

Somethings: Знакомство с Android. Часть 2: Переходы между формами

Итак, продолжим. В этой части мы добавим в проект ещё одну форму и будем открывать её по нажатию кнопки Run. Также сделаем так, чтобы параметры, которые были введены в первой форме, передавались во вторую (они там ещё пригодятся). Однако, ничего страшного мы пока с ними делать не будем, а просто напишем "Введены такие-то числа".

Обработка нажатия кнопки

Напишем в StartScreen.java следующее (строки, которые мы добавляем, выделены другим цветом):

package com.android.life;  import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;  public class StartScreen extends Activity implements OnClickListener {   Button mButton;      /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)   {     super.onCreate(savedInstanceState);     setContentView(R.layout.main); 

    mButton = (Button) findViewById(R.id.RunButton);     mButton.setOnClickListener(this);

  }

  public void onClick(View v)   {     mButton.setText("It works!");   }

}

Здесь выделены добавленные строки. Итак, мы сделали форму слушателем события нажатия на кнопку (имплементировав OnClickListener), и подписались на это событие для кнопки mButton (с помощью setOnClickListener). Для того, чтобы проверить, что всё правильно, в методе, который обрабатывает событие, изменяем заголовок кнопки. Запускаем - работает.

Переход на другую форму

Итак, добавляем еще одну форму. Для этого надо создать два файла - разметки формы(run.xml) и класса формы (RunScreen.java).

Разметку сделаем простейшую:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:layout_width="fill_parent"   android:layout_height="fill_parent"> <TextView   android:id="@+id/Message"   android:layout_width="fill_parent"   android:layout_height="fill_parent" /> </FrameLayout> 

В классе добавим onCreate, в котором свяжем форму с этой разметкой:

package com.android.life;  import android.app.Activity; import android.os.Bundle;  public class RunScreen extends Activity {   /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState)   {     super.onCreate(savedInstanceState);     setContentView(R.layout.run);   } } 

Кроме того, нужно упомянуть о новой форме в AndroidManifest.xml. Для этого в раздел application добавляем следующее:

<activity android:name=".RunScreen">   <intent-filter>     <action android:name="android.intent.action.MAIN" />     <category android:name="android.intent.category.SAMPLE_CODE" />   </intent-filter> </activity>                 

Нам хочется, чтобы это окно появлялось после нажатия кнопки "Run". Пишем в обработчике этой кнопки следующее:

public void onClick(View v) { 

  Intent intent = new Intent();   intent.setClass(this, RunScreen.class);   startActivity(intent);   finish();

}

Запускаем - работает. Теперь объясним, что сделали.

Intent

Intent - это описание некоторого действия, которое должно совершить приложение. Этим действием может быть переход к другому окну, совершение исходящего вызова, открытие списка контактов и т.д.. У Intent-а есть два основных атрибута:

  • action - функция, которую надо выполнить. Задается в виде константы: ACTION_VIEW, ACTION_DIAL и т.д.
  • data - аргумент этой функции, записанный в виде URI

Например, сочетание VIEW_ACTION content://contacts/people/1 соответствует выводу информации о контакте с идентификатором 1, а ACTION_DIAL tel:123 - выводу окна вызова с набранными цифрами 123.

Однако, нам всего этого не нужно, а нужно, чтобы обработчиком Intent-а была сама форма RunScreen. Для этого мы используем функцию setClass (или есть ещё такая setClassName).

Вызов функции startActivity(intent) запускает операцию intent (т.е. открывает окно), finish() завершает текущую задачу (т.е. закрывает окно StartScreen).

Передача данных между окнами

Итак, окно RunScreen появляется, но на нем ничего нет. Рассмотрим, каким образом можно передать параметры, введенные в StartScreen, в окно RunScreen.

У класса Intent, помимо основных атрибутов, есть ещё и второстепенные. В частности, есть такой атрибут extras, где в виде хеша (Bundle) хранятся любые дополнительные параметры. Им-то мы и воспользуемся. Итак, добавим в класс RunScreen.java следующие константы (ключи хеша):

public static final String EXT_COLS = "cols"; public static final String EXT_ROWS = "rows"; public static final String EXT_CELLS = "cells"; 

Теперь модифицируем обработчик onClick в классе StartScreen.java, чтобы он выглядел так:

public void onClick(View v) { 

  EditText rowsEditor = (EditText)findViewById(R.id.RowsEditor);   EditText colsEditor = (EditText)findViewById(R.id.ColumnsEditor);   EditText cellsEditor = (EditText)findViewById(R.id.CellsEditor);      int cols = Integer.parseInt(colsEditor.getText().toString());   int rows = Integer.parseInt(rowsEditor.getText().toString());   int cells = Integer.parseInt(cellsEditor.getText().toString());

  Intent intent = new Intent();   intent.setClass(this, RunScreen.class);

  intent.putExtra(RunScreen.EXT_COLS, cols);   intent.putExtra(RunScreen.EXT_ROWS, rows);   intent.putExtra(RunScreen.EXT_CELLS, cells);

  startActivity(intent);   finish(); }

Итак, мы передали в наш Intent дополнительные параметры. Теперь мы получим их в RunScreen в методе onCreate:

public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.run); 

  Bundle extras = getIntent().getExtras();   int cols = extras.getInt(EXT_COLS);   int rows = extras.getInt(EXT_ROWS);   int cells = extras.getInt(EXT_CELLS);   TextView message = (TextView)findViewById(R.id.Message);   message.setText("Rows: " + rows + "\nColumns: " + cols + "\nCells: " + cells);

}

Теперь, после нажатия на кнопку Run мы видим следующее:

Форма Android

Заключение

Итак, мы добавили в наше приложение ещё одну форму, создали переход на неё и передали параметры из первой формы.

Ссылки

Исходники примера

Автор: darja на 14:23