Пишем первое приложение для Android
В любом деле самое сложное — это начало. Часто бывает тяжело войти в контекст, с чем столкнулся и я, решив разработать свое первое Android-приложение. Настоящая статья для тех, кто хочет начать, но не знает с чего.
Статья затронет весь цикл разработки приложения. Вместе мы напишем простенькую игру “Крестики-Нолики” с одним экраном (в ОС Android это называется Activity).
Отсутствие опыта разработки на языке Java не должно стать препятствием в освоении Android. Так, в примерах не будут использоваться специфичные для Java конструкции (или они будет минимизированы на столько, на сколько это возможно). Если Вы пишете, например, на PHP и знакомы с основополагающими принципами в разработке ПО, эта статья будет вам наиболее полезна. В свою очередь так как, я не являюсь экспертом по разработке на Java, можно предположить, что исходный код не претендует на лейбл “лучшие практики разработки на Java”.
Установка необходимых программ и утилит
- JDK — набор для разработки на языке Java;
- Android SDK and AVD Manager — набор утилит для разработки + эмулятор;
- IDE c поддержкой разработки для Android:
- Eclipse + ADT plugin;
- IntelliJ IDEA Community Edition;
- Netbeans + nbandroid plugin;
Язык программирования Java — зачем его учить и что на нем пишут
Утилиты устанавливаются в определенном выше порядке. Ставить все перечисленные IDE смысла нет (разве только если Вы испытываете затруднения с выбором подходящей). Я использую IntelliJ IDEA Community Edition, одну из самых развитых на данный момент IDE для Java.
Запуск виртуального устройства
Запустив AVD Manager и установив дополнительные пакеты (SDK различных версий), можно приступить к созданию виртуального устройства с необходимыми параметрами. Разобраться в интерфейсе не должно составить труда.
Список устройств
Создание проекта
Мне всегда не терпится приступить к работе, минимизируя подготовительные мероприятия, к которым относится создание проекта в IDE, особенно, когда проект учебный и на продакшн не претендует.
Итак, File->New Project:
По нажатию кнопки F6 проект соберется, откомпилируется и запустится на виртуальном девайсе.
Структура проекта
На предыдущем скриншоте видна структура проекта. Так как в этой статье мы преследуем сугубо практические цели, заострим внимание лишь на тех папках, которые будем использовать в процессе работы. Это следующие каталоги: gen, res и src.
В папке gen находятся файлы, которые генерируются автоматически при сборке проекта. Вручную их менять нельзя.
Папка res предназначена для хранения ресурсов, таких как картинки, тексты (в том числе переводы), значения по-умолчанию, макеты (layouts).
src — это папка в которой будет происходить основная часть работы, ибо тут хранятся файлы с исходными текстами нашей программы.
Первые строки
Как только создается Activity (экран приложения), вызывается метод onCreate(). IDE заполнила его 2 строчками:
Что учить новичку в Android: Java vs Kotlin? Мобильный разработчик [Ru, Android]
super.onCreate(savedInstanceState); setContentView(R.layout.main);
Метод setContentView (равносильно this.setContentView) устанавливает xml-макет для текущего экрана. Далее xml-макеты будем называть «layout», а экраны — «Activity». Layout в приложении будет следующий:
Для этого приложения идеально подойдет TableLayout. Id можно присвоить любому ресурсу. В данном случае, TableLayout присвоен При помощи метода findViewById() можно получить доступ к виду:
private TableLayout layout; // это свойство класса KrestikinolikiActivity public void onCreate(Bundle savedInstanceState)
Теперь необходимо реализовать метод buildGameField(). Для этого требуется сгенерировать поле в виде матрицы. Этим будет заниматься класс Game. Сначала нужно создать класс Square для ячеек и класс Player, объекты которого будут заполнять эти ячейки.
Square.java
package com.example; public class Square < private Player player = null; public void fill(Player player) < this.player = player; >public boolean isFilled() < if (player != null) < return true; >return false; > public Player getPlayer() < return player; >>
Player.java
package com.example; public class Player < private String name; public Player(String name) < this.name = name; >public CharSequence getName() < return (CharSequence) name; >>
Все классы нашего приложения находятся в папке src.
Game.java
package com.example; public class Game < /** * поле */ private Square[][] field; /** * Конструктор * */ public Game() < field = new Square[3][3]; squareCount = 0; // заполнение поля for (int i = 0, l = field.length; i < l; i++) < for (int j = 0, l2 = field[i].length; j < l2; j++) < field[i][j] = new Square(); squareCount++; >> > public Square[][] getField() < return field; >>
Инициализация Game в конструкторе KrestikinolikiActivity.
public KrestikinolikiActivity() < game = new Game(); game.start(); // будет реализован позже >
Метод buildGameField() класса KrestikinolikiActivity. Он динамически добавляет строки и колонки в таблицу (игровое поле):
private Button[][] buttons = new Button[3][3]; //(. ) private void buildGameField() < Square[][] field = game.getField(); for (int i = 0, lenI = field.length; i < lenI; i++ ) < TableRow row = new TableRow(this); // создание строки таблицы for (int j = 0, lenJ = field[i].length; j < lenJ; j++) < Button button = new Button(this); buttons[i][j] = button; button.setOnClickListener(new Listener(i, j)); // установка слушателя, реагирующего на клик по кнопке row.addView(button, new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); // добавление кнопки в строку таблицы button.setWidth(107); button.setHeight(107); >layout.addView(row, new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT)); // добавление строки в таблицу > >
В строке 8 создается объект, реализующий интерфейс View.OnClickListener. Создадим вложенный класс Listener. Он будет виден только из KrestikinolikiActivity.
public class Listener implements View.OnClickListener < private int x = 0; private int y = 0; public Listener(int x, int y) < this.x = x; this.y = y; >public void onClick(View view) < Button button = (Button) view; >>
Осталось реализовать логику игры.
public class Game < /** * игроки */ private Player[] players; /** * поле */ private Square[][] field; /** * начата ли игра? */ private boolean started; /** * текущий игрок */ private Player activePlayer; /** * Считает колличество заполненных ячеек */ private int filled; /** * Всего ячеек */ private int squareCount; /** * Конструктор * */ public Game() < field = new Square[3][3]; squareCount = 0; // заполнение поля for (int i = 0, l = field.length; i < l; i++) < for (int j = 0, l2 = field[i].length; j < l2; j++) < field[i][j] = new Square(); squareCount++; >> players = new Player[2]; started = false; activePlayer = null; filled = 0; > public void start() < resetPlayers(); started = true; >private void resetPlayers() < players[0] = new Player(«X»); players[1] = new Player(«O»); setCurrentActivePlayer(players[0]); >public Square[][] getField() < return field; >private void setCurrentActivePlayer(Player player) < activePlayer = player; >public boolean makeTurn(int x, int y) < if (field[x][y].isFilled()) < return false; >field[x][y].fill(getCurrentActivePlayer()); filled++; switchPlayers(); return true; > private void switchPlayers() < activePlayer = (activePlayer == players[0]) ? players[1] : players[0]; >public Player getCurrentActivePlayer() < return activePlayer; >public boolean isFieldFilled() < return squareCount == filled; >public void reset() < resetField(); resetPlayers(); >private void resetField() < for (int i = 0, l = field.length; i < l; i++) < for (int j = 0, l2 = field[i].length; j < l2; j++) < field[i][j].fill(null); >> filled = 0; > >
Определение победителя
К. О. подсказывает, что в крестики-нолики выирывает тот, кто выстроет X или O в линию длиной, равной длине поля по-вертикали, или по-горизонтали, или по-диагонали. Первая мысль, которая приходит в голову — это написать методы для каждого случая. Думаю, в этом случае хорошо подойдет паттерн Chain of Responsobility. Определим интерфейс
package com.example; public interface WinnerCheckerInterface
Так как Game наделен обязанностью выявлять победителя, он реализует этот интерфейс. Настало время создать виртуальных «лайнсменов», каждый из которых будет проверять свою сторону. Все они реализует интерфейс WinnerCheckerInterface.
WinnerCheckerHorizontal.java
package com.example; public class WinnerCheckerHorizontal implements WinnerCheckerInterface < private Game game; public WinnerCheckerHorizontal(Game game) < this.game = game; >public Player checkWinner() < Square[][] field = game.getField(); Player currPlayer; Player lastPlayer = null; for (int i = 0, len = field.length; i < len; i++) < lastPlayer = null; int successCounter = 1; for (int j = 0, len2 = field[i].length; j < len2; j++) < currPlayer = field[i][j].getPlayer(); if (currPlayer == lastPlayer (currPlayer != null lastPlayer !=null)) < successCounter++; if (successCounter == len2) < return currPlayer; >> lastPlayer = currPlayer; > > return null; > >
WinnerCheckerVertical.java
package com.example; public class WinnerCheckerVertical implements WinnerCheckerInterface < private Game game; public WinnerCheckerVertical (Game game) < this.game = game; >public Player checkWinner() < Square[][] field = game.getField(); Player currPlayer; Player lastPlayer = null; for (int i = 0, len = field.length; i < len; i++) < lastPlayer = null; int successCounter = 1; for (int j = 0, len2 = field[i].length; j < len2; j++) < currPlayer = field[j][i].getPlayer(); if (currPlayer == lastPlayer (currPlayer != null lastPlayer !=null)) < successCounter++; if (successCounter == len2) < return currPlayer; >> lastPlayer = currPlayer; > > return null; > >
WinnerCheckerDiagonalLeft.java
package com.example; public class WinnerCheckerDiagonalLeft implements WinnerCheckerInterface < private Game game; public WinnerCheckerDiagonalLeft(Game game) < this.game = game; >public Player checkWinner() < Square[][] field = game.getField(); Player currPlayer; Player lastPlayer = null; int successCounter = 1; for (int i = 0, len = field.length; i < len; i++) < currPlayer = field[i][i].getPlayer(); if (currPlayer != null) < if (lastPlayer == currPlayer) < successCounter++; if (successCounter == len) < return currPlayer; >> > lastPlayer = currPlayer; > return null; > >
WinnerCheckerDiagonalRight.java
package com.example; public class WinnerCheckerDiagonalRight implements WinnerCheckerInterface < private Game game; public WinnerCheckerDiagonalRight(Game game) < this.game = game; >public Player checkWinner() < Square[][] field = game.getField(); Player currPlayer; Player lastPlayer = null; int successCounter = 1; for (int i = 0, len = field.length; i < len; i++) < currPlayer = field[i][len — (i + 1)].getPlayer(); if (currPlayer != null) < if (lastPlayer == currPlayer) < successCounter++; if (successCounter == len) < return currPlayer; >> > lastPlayer = currPlayer; > return null; > >
Проинициализируем их в конструкторе Game:
//(. ) /** * «Судьи» =). После каждого хода они будут проверять, * нет ли победителя */ private WinnerCheckerInterface[] winnerCheckers; //(. ) public Game() < //(. ) winnerCheckers = new WinnerCheckerInterface[4]; winnerCheckers[0] = new WinnerCheckerHorizontal(this); winnerCheckers[1] = new WinnerCheckerVertical(this); winnerCheckers[2] = new WinnerCheckerDiagonalLeft(this); winnerCheckers[3] = new WinnerCheckerDiagonalRight(this); //(. ) >
Реализация checkWinner():
public Player checkWinner() < for (WinnerCheckerInterface winChecker : winnerCheckers) < Player winner = winChecker.checkWinner(); if (winner != null) < return winner; >> return null; >
Победителя проверяем после каждого хода. Добавим кода в метод onClick() класса Listener
public void onClick(View view) < Button button = (Button) view; Game g = game; Player player = g.getCurrentActivePlayer(); if (makeTurn(x, y)) < button.setText(player.getName()); >Player winner = g.checkWinner(); if (winner != null) < gameOver(winner); >if (g.isFieldFilled()) < // в случае, если поле заполнено gameOver(); >>
Метод gameOver() реализован в 2-х вариантах:
private void gameOver(Player player) < CharSequence text = «Player «» + player.getName() + «» won!»; Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); game.reset(); refresh(); >private void gameOver()
Для Java, gameOver(Player player) и gameOver() — разные методы. Воспользовавшись Builder’ом Toast.makeText, можно быстро создать и показать уведомление. refresh() обновляет состояние поля:
private void refresh() < Square[][] field = game.getField(); for (int i = 0, len = field.length; i < len; i++) < for (int j = 0, len2 = field[i].length; j < len2; j++) < if (field[i][j].getPlayer() == null) < buttons[i][j].setText(«»); >else < buttons[i][j].setText(field[i][j].getPlayer().getName()); >> > >
Готово! Надеюсь, эта статья помогла Вам освоиться в мире разработки под OS Android. Благодарю за внимание!
Видео готового приложения
PS: статья была опубликована по просьбе комментаторов этого поста.
Источник: habr.com
Ява программы на телефон что это
В связи с участившимися вопросами, типа «дайте прогу, которая бы мой телефон превратила в смартфон», решил я создать тему, прочтя которую юзер сможет понять, есть ли смысл искать прогу, которая бы реализовала те или иные возможности.
Итак, для начала нужно чётко осознавать, что телефон и смартфон — кардинально разные вещи. В кратце могу лишь сказать, что смартфон позволяет менять очень и очень многое, перехватывать практически все события, менять некоторые менюшки, стандартные возможности и т.д. Это обусловлено тем, что на смартфонах стоит специальная «расширенная» так сказать операционная система (на нокиах это например Symbian), которая обладает повышенным функционалом. На телефонах стоит «простая» операционная система, позволяющая использовать только то, что нам предоставили разработчики, не позволяя менять ничего кроме настроек, разрешённых ими же.
В наше время поддержкой java никого не удивить. Её реализуют не только на смартфонах, но и на телефонах, причём давно. Программами java являются файлы имеющие расширение «.jar», и являющиеся по сути простым архивом. Для старых телефонов нужен ещё и маленький файл описания «.jad», который содержит некоторую информацию о приложении.
На Symbian тоже поддерживается java, но не всегда корректно и так быстро, как на некоторых телефонах. Но у них есть свой специальный формат приложений, имеющий то самое злополучное расширение «.sis».
Многие спрашивают, какой прогой перегнать sis в jar. Ответ один: никак, уже хотя бы потому, что возможности sis-приложений и jar-приложений очень различаются, поэтому даже если и появится вдруг где-нибудь такая перегоняющая программа, то толку с неё будет мало, т.к. то, что умеет смартфон, телефон сделать не сможет. Исключение составляют такие приложения, которые пишутся и в формате jar и в формате sis, но это двойная работа, и я, честно говоря, таких экземпляров не встречал.
Теперь о возможностях java-платформы. Вообще язык Java богатый, но большинство его возможностей направлено на разработку игр.
Возможности программ (т.е. приложений, направленных не на развлечение, а на выполнение некоторых функций, типа переводчика, диктофона и т.д.) на разных телефонах разные. Чем новее телефон — тем у него больше возможностей.
BluetoothIrDA: Java-приложения могут использовать Bluetooth и Инфракрасный порт для связи с другими телефонами, обмениваться через них данными.
Интернет: Java-приложения могут подключаться к Интернету через GPRS. Если я не ошибаюсь, то разрешена полная работа с Интернетом: подключение, закачки и т.д.
SMS: Java-приложения могут отправлять СМС-сообщения, спрашивая при этом у вас, стоит ли это делать. Поэтому про вирусы дружно забыли.
Контакты: Java-приложения могут читать и писать (создавать, редактировать) информацию о ваших контактах и событиях календаря.
Камера: Java-приложения могут делать снимки камерой и даже записывать видео. При это стоит отметить то, что качество камеры при этом ухудшается, т.к. например нельзя включить подсветку, макрорежим, ночной режим и т.д.
Аудиозапись: Java-приложения могут записывать звук с микрофона (и конечно проигрывать его потом).
Прочие мелкие возможности заключаются в хранении любый файлов в самом Java-приложении и их чтение. Эта возможность реализована на всех телефонах, поэтому распространены программы вроде тех же переводчиков, хранящих базы слов, слайд-шоу приложений — программы, содержащие фотографии и отображающие их и т.д., но возможности этих программ обычно жёстко ограничены.
Хранение информации: практически все телефоны умеют хранить информацию в специальной секции под названием RecordStore, куда можно поместить всё что угодно. Единственный недостаток этого «хранилища» в том, что каждая программа хранит свою информацию отдельно от других, и вне этой программы её прочитать невозможно. Так же после удаления программы удалится и всё то, что она хранила в RecordStore.
Конечно, это не все возможности Java-приложений, но они наиболее востребованны и интересны.
Внимание! Разные модели телефонов имеют разные возможности java-машин, или попросту говоря, приложения могут выполнять не все команды на всех телефонах. Вспомнить хотябы Bluetooth. Далеко не все телефоны, на которых есть БТ позволяют играть через него на java-играх. Например:
K500 — нету файловой системы. Другими словами, приложения не смогут загрузить файл, сохранённый на телефоне.
K700 — нету Bluetooth и файловой системы.
Поэтому перед тем, как искать какую-то программу, узнайте, поддерживает ли ваш телефон нужные возможности. Форумы с поиском в помощь.
Теперь о тех функциях, которые многие так хотят получить, но пока что (а может и никогда) не смогут получить из Java:
Защита смс от просмотра: Java не имеет доступа к СМС.
Фильтр звонков: Java не может отлавливать звонки и тем более блокировать их.
Зашита папок паролем: Java может работать с папками и файлами. Но она НЕ МОЖЕТ перехватывать обращение телефона к ним, поэтому никаких паролей на их чтение поставить НЕЛЬЗЯ. Единственный выход — шифрование ФАЙЛОВ. В этом случае каждый файл в отдельности будет модифицироваться так, что его чтение станет бесполезным, до обратного преобразования (для которого обычно и нужен пароль)
Антивирусы: во-первых, возможностей Java недостаточно для того, чтобы написать
более-менее работоспособный вирус, т.к. при любом обращении к файловой системе, Bluetooth, Интернет или отправкой СМС у вас будет спрошено, стоит ли это делать. Думаю никто не будет слать СМС на неизвестные номера? Это раз. Во-вторых, Java не имеет возможности так же отлавливать события, чтобы блокировать их.
Единственное, что может такой «Антивирус» — так это сканировать ваши файлы, но стоит помнить о бесконечных запросах и скорости чтениязаписи файлов на телефоне. Так же важно то, что далеко не все телефоны могут запускать одновременно несколько Java-приложений. Последний гвоздь в крышку гроба таких антивирусов — во время работы Java-приложений телефон неплохо исползует акумулятор, что вряд ли стоит «Антивируса», от коротого даже нету толка.
Изменение внешнего вида, меню, запрет функций телефона: всё это Java-приложение сделать не может, т.к. у него нету доступа ни к меню, ни к прочим полезностям, вроде замены стандартного окошка информации о состоянии пямяти и аккумулятора телефона.
Инфракрасный порт в телефонах Sony Ericsson похоже что тоже недоступен. В любом случае реализовать ПУЛЬТ ДЛЯ ТЕЛЕВИЗОРА НЕВОЗМОЖНО, т.к. для этого даже не хватит мощности ИК-порта (вспомните, на каком расстоянии нужно держать телефоны при передаче чего-либо через ИК-порт? Вот на таком же расстоянии и к телевизору нужно будет подойти).
Вывод. Что же кроется под Java-приложениями? Грубо говоря, Java — всего-лишь игрушка с небольшими возможностями. На ней можно сделать хорошую игру, работающую по Bluetooth, но ей невозможно расширить возможностей телефона. Ей можно делать удобные инструменты для изменений файлов, контактов и т.д., но нельзя ей заменить стандартные аналогичные средства.
Оноситесь к Java не более чем как к маленьким бонусам, которые могут помочь вам интересно провести время, пообщаться в чате, посидеть в интернете и т.д. Не стоит ждать от неё того, что она расширит возможности телефона или изменит их. Если вам нужен полный контроль над телефоном — только смартфон поможет решить эту проблему.
Надеюсь информация поможет некоторым поближе узнать Java-приложения, и запомнить, что стоит от них ждать, а чего не стоит.
Источник: ublaze.ru
Ява программы на телефон что это
- Spotify – приложение для потоковой передачи музыки и подкастов, доступное на телефонах, планшетах и настольных компьютерах.
- Twitter – мобильное приложение популярной платформы социальных сетей с сервисами микроблогов.
- Opera Mini (веб-браузер) – java-приложение для пользователей мобильного интернета, которое увеличивает скорость загрузки страниц за счет сжатия.
- Nimbuzz Messenger – одно из самых известных Java-приложений для обмена мгновенными сообщениями.
- CashApp – приложение мобильного платежного сервиса Square Cash для безопасных переводов. Код CashApp для Android написан по большей части на Java.
Заключение
Java считается фундаментальным языком разработки приложений для Android. Он также позволяет разработчикам писать код, который без проблем работает на нескольких мобильных платформах. В реальном мире существуют приложения Java в различных областях, таких как игры, обмен мгновенными сообщениями, потоковая передача музыки и торговля.
Источники
- https://www.openxcell.com/blog/benefits-of-java-for-app-development/
- https://www.openxcell.com/blog/applications-of-java/
- https://www.xicom.biz/blog/why-should-you-choose-java-programming-language-for-mobile-application-in-2019/
Источник: proglib.io
Десять самых популярных Java-приложений для мобильных телефонов
Данное Java-приложение пригодится тем пользователям, чьи мобильные телефоны обделены встроенными секундомерами. Интерфейс программы наделен сразу двумя элементами для отсчета времени – циферблатом и полем цифрового табло. Навигация осуществляется только при помощи клавиатуры телефона.
Справа от циферблата располагается поле, на котором отображается до 7 последних результатов, в том числе и промежуточных. Одним словом, это просто находка для продвинутого физрука, желающего использовать все возможности, предоставляемые мобильным телефоном. Ну а конкурентами StopWatch могут стать разве что встроенные секундомеры, которые довольно часто встречаются в телефонах.
- Разработчик: mjSoftware
- Сайт: www.mjsoft.nm.ru
- Распространение: Freeware
- разумеется, сложение, вычитание, умножение и деление;
- извлечение целой или дробной части из числа;
- вычисление квадрата, куба или квадратного корня;
- вычисление тригонометрических функций (синуса, косинуса, тангенса);
- вычисление логарифмов (натурального и десятичного);
- возведение числа в произвольную степень;
- автоподстройка (размер цифр и т.д.) под все размеры экранов, поддержка цветных и черно-белых дисплеев;
- широкие возможности редактирования, отмена последнего действия, ввод числовых констант (число Пи).
- Разработчик: Konstantin Knizhnik
- Сайт: www.garret.ru
- Распространение: Freeware
- Разработчик: mjSoftware
- Сайт: www.mjsoft.nm.ru
- Распространение: Freeware
- объем оперативной памяти телефона;
- разрешение экрана;
- количество отображаемых экраном цветов;
- наименование установленной Java-платформы;
- версия Java, а также множество другой информации по Virtual Java Machine;
- наличие или отсутствие возможности аудио- и видеозаписи;
- формат аудиозаписи (диктофона, проще говоря);
- полный перечень поддерживаемых телефоном форматов медиафайлов.
- Разработчик: SVasiliy
- Сайт: www.mmj2.pp.ru
- Распространение: Freeware
- интерфейс на одном из шести доступных языков (русском, украинском, английском, французском, венгерском и польском), так что выбирайте нужную вам версию программы;
- адресная книга, причем есть возможность использования адресной книги телефонов Siemens;
- поддержка POP3- и SMTP-протоколов;
- поддержка протокола безопасной передачи данных SSL (только для версий с MIDP 2.0);
- полноценная поддержка кириллицы (еще бы, при отечественном разработчике!);
- возможность предварительного просмотра заголовков писем перед их загрузкой;
- загрузка электронных писем с сохранением копии на сервере (также есть функция их удаления);
- возможность загрузки части письма (с заданным количеством строк от начала), а впоследствии и полной закачки;
- загрузка полностью писем определенного размера (размер задается пользователем);
- конвертирование HTML-кода в текст;
- просмотр писем в кодировках: KOI8-R, Windows-1251, UTF-8 и ISO-8859-2;
- поддержка мультимедиа;
- наличие экспорта загруженных писем в EML-файлы;
- возможность сохранения присоединенных файлов;
- отправка писем с вложенными данными;
- возможность создания нескольких учетных записей. Это наверняка понравится пользователям с десятком адресов электронной почты.
- Разработчик: JIMM Project
- Сайт: www.jimm.org
- Распространение: Freeware
- настройка параметров ICQ-сервера, типов подключения и количества возможных попыток;
- настройка прокси-сервера с поддержкой авторизации;
- изменение цветовых схем, настроек чата, сортировка и группировка контактов;
- настройка звуковых уведомлений о пришедших сообщениях и появлении пользователей из листа контактов;
- встроенный счетчик «съеденного» трафика;
- автоматическая проверка обновлений;
- отправка снимков, сделанных фотокамерой телефона (при поддержке подобной функции и соответствующих настройках доступа Java-приложений к камере).
- Разработчик: Opera Software ASA
- Сайт: www.operamini.com
- Распространение: Freeware
- наличие или отсутствие загрузки изображений;
- установка высокого качества загружаемых изображений;
- выбор типа шрифта (по умолчанию стоит мелкий, для отображения максимального количества текста);
- установка времени.
Источник: 3dnews.ru