среда, 14 апреля 2010 г.

Проапдейчена статистика платформ на Андроиде

Сабж: http://developer.android.com/resources/dashboard/platform-versions.html

Ярлыки:

понедельник, 15 марта 2010 г.

Использование ProgressDialog

В этом небольшом посте покажем использование ProgressDialog. ProgressDialog можно использовать для отображения на экране, когда выполняется какая-либо долговременная операция (например, в рабочем потоке идет скачивание файла с сервера в Интернете).

Программа ниже демонстрирует следующее:

  • Запуск рабочего процесса

  • Работу с ProgressDialog

  • Динамическое создание UI



Скриншотик:



Исходник:

package com.thecompany.testprogressdialog;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
 
public class MainActivity extends Activity {
 
private Button clickBtn;
private ProgressDialog progressDialog;
 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
 
clickBtn = new Button(this);
ll.addView(clickBtn);
 
clickBtn.setText("Click me");
clickBtn.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
 
progressDialog = ProgressDialog.show(MainActivity.this, "", "Loading...");
 
new Thread() {
public void run() {
try {
sleep(3*1000);
} catch (Exception e) {
Log.e("MainActivity", e.getMessage());
}
progressDialog.dismiss();
}
}.start();
}
});
 
this.setContentView(ll);
}
}
 


Как видим, если задать title для ProgressDialog пустой строкой, то диалог покажется таким маленьким, скромненьким окошечком.

Данный пост отталкивается от поста Using ProgressDialog in Android Activity в блоге The Developer's Info

Ярлыки: , ,

Использование Handler для запуска рабочих потоков

В приложениях часто требуется запускать так называемые рабочие потоки (worker threads), в которых выполняется какая-либо долговременная работа, например, печать документа, скачивание файла из Интернета, запись в файл (в Андроиде запись на SD карту - очень медленная операция), и так далее. Неразумно это делать в потоке, который обрабатывает UI - т.к. в этом случае приложение не будет реагировать на ввод до конца операции, и будет восприниматься со стороны пользователя как "зависшее". Для выполнения как раз таких действий из UI-потока запускаются рабочие потоки.

В этом посте будет показано, как использовать android.os.Handler для запуска таких потоков. Также показано, как динамически создается LinearLayout и динамически в него добавляется кнопка, при нажатии на которую и происходит запуск потока. Также показано использование android.app.ProgressDialog - он отображается на экране до тех пор, пока рабочий процесс не завершит свое выполнение.

Вот скриншот программки с кнопкой:



А вот скриншот с запущенным рабочим потоком:



Итак, код в студию:

package com.thecompany.testhandler;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
 
public class MainActivity extends Activity {
 
private Button clickBtn;
private ProgressDialog progressDialog;
 
private Handler handler = new Handler() {
 
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
progressDialog.dismiss();
}
};
 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
 
clickBtn = new Button(this);
ll.addView(clickBtn);
clickBtn.setText("Click me");
clickBtn.setOnClickListener(new OnClickListener() {
 
@Override
public void onClick(View v) {
processThread();
}
});
 
setContentView(ll);
}
 
private void processThread() {
progressDialog = ProgressDialog.show(MainActivity.this, "Wait", "Running loooong process...");
 
new Thread() {
public void run() {
runLongProcess();
handler.sendEmptyMessage(0);
}
}.start();
}
 
private void runLongProcess() {
 
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
Log.e("MainActivity", e.getMessage());
}
}
}
 


Как видно, использование Handler вполне себе легко и не должно вызывать сложностей. Однако, в настоящее время для запуска рабочих процессов рекомендуется использовать AsyncTask. Подробнее об этом можно прочитать в статье Painless Threading.

В статье Android, Part III: Dynamic Layouts можно подробнее узнать о создании динамических лэйаутов. В блоге The Developer's Info можно прочитать пост Using Handler for long-time operations in Android, который и послужил отправной точкой для написания данного поста.

Ярлыки: ,

Проверка состояния SD Card

Как проверить, установлена ли SD Card в телефоне:

String storagestate = Environment.getExternalStorageState();
if (!storagestate.equals(Environment.MEDIA_MOUNTED) ) {
// SD Card is not mounted, do smth, e.g. show alert
}

Метод Environment.getExternalStorageState() возвращает строку, которая указывает состояние SD карты. Возможные значения можно посмотреть в API: android.os.Environment.getExternalStorageState().

Ярлыки: ,

четверг, 11 марта 2010 г.

Распространение приложений через Android Market

Поговорим о распространении приложений через Android Market. Это следует обсудить по двум причинам:

  • Android market - система дистрибуции приложений, идущая "из коробки" почти для всех телефонов на Андроиде (почти для всех, так как в некоторых странах не дают доступ к Андроид Маркету)

  • существуют серьезные ограничения для дистрибуции платных приложений, которые зависят от гражданства разработчика


Итак, разработчики из более чем ста стран могут публиковать бесплатные приложения для Андроида. В число этих стран входят Россия, Украина, Республика Беларусь и Казахстан. Полный список стран находится здесь: Supported locations for free publishers.

Разработчики из 11 стран могут публиковать на Маркете платные приложения. Ни одна страна из бывшего СССР, включая Россию, к сожалению, не входит в этот список. Вот эти 11 стран:

  • Austria

  • France

  • Germany

  • Italy

  • Japan

  • Netherlands

  • New Zealand

  • Spain

  • Switzerland

  • United Kingdom

  • United States


Supported locations for distributing applications - здесь находится вышеприведенный список стран (для платников), + еще другая полезная информация.

Что ж, разработчикам из России можно пока что публиковать только бесплатные приложения. Но остается еще пара вариантов для заработка:

  • Публикация платников в других каталогах (например, SlideMe)

  • Заработок на рекламе - т.е. сделать бесплатное adware-приложение. По отзывам (Android Market — заработай себе на пиво - Часть 1, Часть 2), заработок от размещения рекламы в приложениях может сравняться, а то и превзойти заработок от продажи приложений.

Ярлыки: , ,

вторник, 9 марта 2010 г.

Робот на базе Андроид

Робот на базе android - два инженера сделали гусеничный робот, двигающийся по компасу. Сигнал компаса поступает от T-Mobile G1.

Wired разместил статью про этого робота Android Phone Grows Up, Becomes Brain for Real Robot, в которой приведена пошаговая инструкция для сборки робота. Что интересно, комплектующие для него обошлись всего лишь в 30 долларов (не включая доставки).

Ярлыки:

понедельник, 8 марта 2010 г.

Отладка на устройстве

Разберем, как запускать и отлаживать программы не в эмуляторе Андроида, а прямо на устройстве. Я пользуюсь HTC Hero, поэтому в качестве Андроид-устройства будет выступать именно он. На момент написания поста на машине для разработки у меня установлен Windows XP + Eclipse, соответственно, все данные будут приведены для этого окружения.

Итак, первое что надо сделать - это установить USB-драйвер устройства. Рассказано, как это сделать по следующей ссылке: http://developer.android.com/sdk/win-usb.html. Я же здесь перескажу это своими словами:


  1. В Eclipse открыть Window->Android SDK and AVD Manager, выбрать Available Packages, и затем выбрать USB-драйвер. После этого инсталлировать его. В моем случае драйвер был инсталлирован в каталог D:\android-sdk-windows\usb_driver

  2. Через USB-кабель подсоединить телефон к компьютеру. Windows обнаружит новое устройство и запустит Hardware Update Wizard.

  3. Выбрать "Install from a list or specific location" и нажать "Далее"

  4. В следующем окне указать местоположение драйвера устройства, т.е. D:\android-sdk-windows\usb_driver

  5. Нажать кнопку "Далее", драйвер будет установлен.



После установки драйвера советую перезагрузить компьютер, т.к. у меня Андроид-устройство стало определяться только после перезагрузки компа.

Теперь, когда драйвер установлен, проверим, определяет ли комп подключенный телефон. Подключим телефон через USB-кабель, зайдем в каталог $ANDROID_SDK/tools и выполним команду:

adb devices

После этого в консоли должен появиться список подключенных устройств. У меня комп выдал следующее:


D:\android-sdk-windows\tools>adb devices
List of devices attached
HT9C2L902945 device


Теперь, запустим Dalvik Debug Monitor Service командой

ddms

Запустится окно монитора, который позволит получить информацию о состоянии устройства, доступ к логам, и т.д.

После этого в Eclipse следует установить в качестве target запуска не виртуальное устройство, а реальное, после чего программы будут устанавливаться и запускаться не на эмуляторе, а на реальном железе.

Вот и все.

UPD: вот хорошая статья, в который рассказано про Android Debug Bridge: Using ADB – Android Debug Bridge

Ярлыки: ,