[Android] AppWidget

| トラックバック(0) |

Androidの公式ブログ(Android Developers Blog)に、
Introducing home screen widgets and the AppWidget framework」という記事がありました。

内容は、Android 1.5 SDKで導入されたAppWidgetフレームワークにより、
開発者がホームスクリーン上でウィジットとして応答できるようになったということで、
具体的なサンプルソースコード(抜粋)と、その解説が掲載されています。
※サンプルソースコード(フル)の入手先(SVN  URL)については、「wiktionary-android - Google Code」に記載されています

また、AppWidgetについては、Android 1.5 SDK付属のApiDemosの下記ソースコードにもサンプルコードがあります。
%android-sdk-1.5_pre%\platforms\android-1.5\samples\ApiDemos\src\com\example\android\apis\appwidget\*.java

簡単に読んだ限りでは、以下の実装をすれば良さそうです。
※実際に試せてはないです...

1.AppWidgetProviderを継承したクラスを作成し、onUpdate()をオーバーライドして、フレームワークから呼び出されるウィジットの更新処理で、あなたのウィジットとして必要な処理を実装する。
このOnUpdate()では、時間のかかる処理をしてしまうと、Application Not Respoting(ANR)...応答なし、とみなされるので、そういう場合には、サービスで対応させる。

public class AppWidgetTest extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.v("AppWidgetTest", "onUpdate");
    }
}

2.AppWidgetの最少幅、最小高さ、更新間隔などを記載したappwidget-providerをxmlに追加する。

<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="(セル(区画)の数*74)-2)dipを指定する"
    android:minHeight="(セル(区画)の数*74)-2)dipを指定する"
    android:updatePeriodMillis="更新間隔をミリ秒でいれる"
    />

3.アプリがAppWidgetとしてふるまうために、「android.appwidget.action.APPWIDGET_UPDATEに応答できるよ」ということを、AndroidManifest.xmlで宣言し、応答するAppWidgetProviderを継承したクラス(上記の1)、appwidget-providerのxml(上記の2)をメタデータとして関連づける。

<!-- Broadcast Receiver that will process AppWidget updates -->
<receiver android:name=".AppWidgetProviderを継承したクラス名" android:label="ウィジット名文字列">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/appwidget-providerを記載したxmlファイル名(.xml拡張子は除く)" />
</receiver>

Android SDKに付属のサンプルコードに含まれる「Snake」をビルドし、実行してみました。
※ソースコードは、%android-sdk%\samples\Snakeにあります

Snake.png

ゲームの内容としては、黄色い頭と赤い胴体の蛇(Snake)を上下左右カーソルキーで操作し、ランダムに出現する黄色いリンゴを食べ続けるというものです。リンゴを食べると、胴体が長くなり、だんだん移動速度も早くなります。自分の胴体や周囲の緑の壁に衝突するとゲームオーバーです。

ゲームの主要部分は、SnakeVIew.java(約560行)に書かれており、数少ないゲームのサンプルプログラムの一つです。このソースコードをベースに、音をつけたり、ネットワーク対戦型に拡張するなどすれば勉強になると思います。

※ちなみに、このSnakeゲームは、約25年前にPC-88でテープレコーダーから読み込んで遊んでいました(懐かしいです)

[Android] JetBoy

| トラックバック(0) |

Android 1.5 Early Look SDK付属のサンプルコードに含まれる「JetBoy」をビルドし、実行してみました。
※ソースコードは、%android-sdk-1.5_pre%\platforms\android-1.5\samples\JetBoyにあります

JetBoy

上図のとおり、横スクロール型シューティングゲームの見た目ですが、ゲームのサンプルコードだけでなく、Android 1.5で新規に追加されるandroid.mediaパッケージJetPlayerクラスのサンプルコードとなっています。

ゲームの内容としては、右から流れてくる隕石(Asteroid)に対して、タイミングよくボタンを押し、隕石を破壊するものですが、破壊できた隕石の数に応じて、BGMのビートが変更されるというものです。
※JetBoy(自機)の上下移動は自動的に行われます

このBGMのビートを変更しているソースコードは、JetBoyView.javaファイル、JetBoyViewクラスのprocessJetEvent()メソッド内のJetPlayerインスタンスへの呼び出しであり、JetPlayerクラスのためのサンプルコードとも言えそうです。
※背景の2重スクロールも同ファイルdoDrawRunning()メソッドで実現しています
※JetPlayerクラスのドキュメントは、%android-sdk-1.5_pre%/docs/reference/android/media/JetPlayer.htmlにあります

ちなみに、ゲーム終了時に50個以上破壊しているとクリアとなります。

はじめてのAndroidプログラミング―「Android SDK」で「Googleケータイ」用ソフトをつくる! (I/O BOOKS)」を読みました。
※本のタイトルが以前紹介した[Android] 「初めてのGoogle Androidプログラミング」を読みました - adakodaに似ていますが、別の本です

「はじめての...」ということで、初心者の方が対象です。
Android SDK1.0/1.1が対象ですが、1.1に特化した記載は無いです。
A5サイズなので片手で持って読めます。
以下、詳細です。
※全部で303ページ11章あります。

第1章 Android SDK (9ページ)
Android / SDKとは何か、Androidの構造など。

第2章 開発環境の整備 (30ページ)
Android SDK(1.1の新しいURL)の入手方法、SDKのインストール、Eclipse+Pluginのインストール、エミュレータの起動など。

第3章 まずは「Hello, World!」 (31ページ)
EclipseでHello Worldの作成する方法に加え、TextViewを追加して文字列を表示する方法。デバッガの使い方。AndroidManifest.xmlの記述など。

第4章 SDK付属のサンプルを解説 (45ページ)
SDK付属サンプルのLunarLander(月面着陸ゲーム)のソースコードに日本語でコメントをつけたソースコードが掲載されています。NotePadは、2ページだけですが紹介されています。
LunarLanderのようなゲームを作成したい方は、同コメントが参考になると思います。

第5章 コンポーネントについて (19ページ)
アクティビティ、ビュー、インテント、サービス、通知、コンテント・プロバイダなど。

第6章 画面のレイアウト (48ページ)
LinearLayout、TableLayout、RelativeLayout、AbsoluteLayout、その他のレイアウト、ボタンが押された時の処理、その他のコンポーネント(アナログ時計、デジタル時計、チェックボックス、オートフィル、プルダウンメニュー、画像のギャラリーの表示)、リソースファイルの画像ファイルの表示。
DroidDrawというコンポーネントをドラッグアンドドロップしてXMLファイルを作成するツールの紹介。

第7章 データの入出力 (27ページ)
ファイルの入出力、データベースの入出力(SQLite)など。

第8章 セキュリティ (4ページ)
アクセス制御としてユーザーIDの概念など。

第9章 各種サンプル (51ページ)
ビューの切り替え、ラジオボタン、オプションメニュー、コンテキストメニュー、プレファレンスの保存・取り出し、ファイル操作(第7章とは違って、ディレクトリのファイル一覧を表示するサンプル)、画像を移動させる、など。

第10章 トップ画面に項目を追加してアプリを動かす (9ページ)
アプリのインストール、アンインストール方法など。

第11章 「Android SDK」付属の「その他」のツール (6ページ)
Hierarchy Viewer、Draw 9-patchの紹介など。

Amazonの商品の説明は、以下のリンクから参照できます。

はじめてのAndroidプログラミング―「Android SDK」で「Googleケータイ」用ソフトをつくる! (I/O BOOKS)  

[Android] Android 1.5 Early Look SDK

| トラックバック(1) |

「Android 1.5 Early Look SDK」がリリースされました。
こちら(http://developer.android.com/sdk/preview/)のページからダウンロードできます。
※SDK1.5では、ADTの更新も必要であり、新しいバージョンのADT 0.9も公開されています。

また、Android1.5の機能(ハイライト)については、
こちら(http://developer.android.com/sdk/preview/features.html)に記載されています。

 

インストール手順

  1. http://developer.android.com/sdk/preview/ページを表示し、SDKとADT 0.9をダウンロードする。
  2. ダウンロードしたSDKを任意のフォルダに解凍/展開する。
  3. Eclipseを起動し、「Help」 > 「Software Update」メニューをクリックし、
    表示された「Software Updates and Add-ons」画面の「Installed Software」タブを表示後、
    「Android Development Tools」「Android Editors」を選択し、「Uninstall」ボタンをクリックする。
    ※この作業は、古いADT(例えば0.8)をインストールしていた方が対象です。
  4. 「Help」 > 「Software Update」メニューをクリックし、
    表示された「Software Updates and Add-ons」画面の「Available Software」タブを表示後、
    「Add Site」ボタンをクリックし、表示された「Add Site」画面の「Archive」ボタンをクリックし、
    ダウンロードしてきたADT 0.9(ADT-0.9_pre.zip)を選択、
    追加されたツリーアイテムを選択した状態で「Install」ボタンをクリックし、
    インストールを開始させる(その後の手順は、表示された指示に従う)。
  5. 「Window」 > 「Preferences」メニューをクリックし、
    表示された「Preferences」画面の「Android」をクリックし、
    「SDK Location」にAndroid 1.5 SDK(android-sdk-windows-1.5_pre)のパスを設定し、
    「Apply」「OK」ボタンをクリックし、画面を閉じる。
  6. 環境変数でSDKのパスを追加していた場合には、更新する。
    ※コマンドラインから新しいコマンド(例えば、android)などを実行できれば、OKです。

 

その他

  • ADT 0.9では、「New Android Project」ウィザードで、「Min SDK Version」を設定できるようになっています。
    ※Android 1.5は、Min SDK Version = 3
  • ADT 0.9からAVD(Android Virtual Device)として、複数のシステムイメージを選択して起動できるようになっています。
  • 利用可能なAVDを表示するには、コマンドラインから「android list targets」を実行します。
    ※表示された[1][2][3]などがtatget IDです。
  • AVDを使用するには、少なくとも1つ以上のAVDを作成する必要があり、
    AVDを作成するには、コマンドラインから「android create avd --name sdk1.5 --target 2」などを実行します。
    ※ここでの例では、--nameで、AVDの名前として「sdk1.5」、--tagetで、IDとして2を指定することでAndroid 1.5を選択しています。
    ※作成していない状態で、EclipseからAndroidプロジェクトを実行すると、
    「Failed to find an AVD compatible with target 'Android 1.5'. Launch aborted.」のようなエラーが表示されます。
    ※2009/4/29追記:Failed to ...の対処方法の詳細については、「[Android] Android Virtual Devices (AVDs) - adakoda」にも詳細記事があります
  • 任意のAVDを指定してエミュレーターを起動する場合、コマンドラインから「emulator @sdk1.5」などを実行します。
    @(アットマーク)の後に、作成したAVDの名前(ここでは、sdk1.5)を指定します。
    ※sdk1.5は、ここでのサンプルですので、作成された名前に適宜読み替えてください。
  • 作成したAVDを削除するには、コマンドラインから「android delete sdk avd sdk1.5」などを実行します。
    ※ここでは、sdk1.5という名前のavdを指定していますが、適宜読み替えてください。

 

  Android1.5

1.AnalogClock(アナログ時計)

Android.widgetパッケージに含まれるAnalogClockクラス。
Androidのソースコードでは、frameworks\base\core\java\android\widget\AnalogClock.java。

約240行のソースコードですが、基本となるアナログ時計を実装しています。
外観は、「アナログ時計(AnalogClock)を使用するには - 逆引きAndroid入門」からも参照できます。

時計の針は、リソースから取得したDrawableを、onDraw()で、Canvasを回転させて描画しています。
時計の更新は、1分毎に行われるのですが、このきっかけを作っているのは、
onAttachedToWindow()で、Intent.ACTION_TIME_TICKというIntentFilterをregisterReceiver()している処理です。

2.DigitalClock(デジタル時計)

同じくAndroid.widgetパッケージに含まれる、DigitalClockクラス。
Androidのソースコードでは、frameworks\base\core\java\android\widget\DigitalClock.java。

こちらも約140行と短いソースコードですが、基本となるデジタル時計を実装しています。
外観は、「デジタル時計(DigitalClock)を使用するには - 逆引きAndroid入門」からも参照できます。

時計の文字は、TextViewを使用しています。
時計の更新は、1秒毎に行われるのですが、このきっかけを作っているのは、
onAttachedToWindow()で、Handlerに対して1秒後にpostAtTime()している処理です。

3.AlarmClock(アラーム付きデジタル時計)

AndroidにプレインストールされているAlamClockアプリケーション。
Androidのソースコードでは、packages\apps\AlarmClock。

アラーム機能を実装しているため、同機能を実装する際に参考になります。

時計の更新は、上述したAnalogClockと同じ仕組みです。

4.GlobalTime

OpenGL ESを使用。
Androidのソースコードでは、development\samples\GlobalTime\src\com\android\globaltime。

時計の更新は、連続して行われるのですが、このきっかけを作っているのは、
GlobalTIme.javaのhandleMessage()で、sendEmptyMessage()している処理です。
※仕組みとしては、上述したDigitalClockと同じですが、さらに更新間隔が短いです。

  • Austria(オーストリア)
  • Germany(ドイツ)
  • United Kingdom(イギリス)
  • United States(アメリカ合衆国)

※2009年4月2日現在
※ただし、USとUK在住の開発者に限る(追記)

ソフトウェアエミュレーターと実機のデバイスの両方が起動・接続している状態で、adb shellを実行した際に表示されるエラー。
対処方法は、どちらかを終了するだけ。
ホームキー(家のマーク)を長押しする。
※ここでのタスク切り替え画面とは、(すべてではないですが)Windows/LinuxのAlt + Tabキー、Mac OSXのCmd + Tabキーのようなイメージ

センサーマネージャーのサンプルコードです。

public class SensorSample extends Activity implements SensorListener {
    private SensorManager mSensorManager;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this,
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_FASTEST);
}

@Override
protected void onStop() {
mSensorManager.unregisterListener(this);
super.onStop();
}

@Override
public void onSensorChanged(int arg0, float[] arg1) {
switch (arg0) {
case SensorManager.SENSOR_ORIENTATION: // 1
// arg1[0]
// arg1[1]
// arg1[2]
break;
}
}
}

SensorManagerのインスタンスを取得するには、ActivityクラスのgetSystemService()を呼び出します。
センサーイベントをリスニングするには、同インスタンスに対し、registerListener()を呼び出します。
このとき、
第1引数には、SensorListnerを実装したクラスのインスタンス、
第2引数には、リスニングしたいセンサーの種類(をビットフィールドで指定)、
第3引数には、リスニングする頻度、
を指定します。
すると、SensorListnerを実装したクラスのインスタンスのonSensorChanged()が呼び出されますので、
引数として渡された、arg1[]を参照することで、センサーの値にアクセスできます。

参考となるサンプルコードは、ApiDemos\src\com\example\android\apis\os\Sensors.javaです。

※2009/04/07追記:public void onAccuracyChanged(int sensor, int accuracy) {} も必要です。
※2009/04/30追記:unregisterListener()を呼び出すのは、OnStop()よりも、onPause()の方が正しい?かも
※2009/04/30追記:更新された内容を含む新しい記事「[Android] Redesigned Sensor Manager APIs(Android1.5) | The type SensorListener is deprecated - adakoda」があります

<<前のページへ 2627282930313233343536

Android 楽しいよ!

2010年11月

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

自作フリーソフトウェア