Home

throw Life

描いて教えるナビゲーション「DrawNavi」~ Android-SDK 0.9beta対応 ~

Android-SDKの0.9betaが発表されましたので、早速アプリを作ってみました。

DrawNaviとは

道順を描いて教えるナビゲーションアプリです。

ログイン(@User-A)

P2P(GTalk)を利用していますので、Gmailアカウントでログインします。

設定の確認(@User-A)

上部のステータスバーをドラッグすると開く事ができ、設定を確認出来ます。

自分の位置を送る(to User-B)

メニューを開いて、自分の位置を相手(User-B)に送ります。

道順を描く(@ User-B)

相手の現在地を確認し、目的地への道順を描く。

道順を送る(to User-A)

メニューを開いて、先ほど描いた道順を相手(User-A)に送ります。

実装
MapView

MapViewはGoogle Mapsを利用しています。
Android-SDK-1.0r1以降にアプリケーションを配布する際には、Google Mapsを利用するAPI KEYを設定する必要があります。
0.9betaを利用した現時点では適当な文字列で良いようです。

public class DrawNavi extends MapActivity {
 
  private final static String GMAP_KEY = "myapikey, ";
  private void MapView mv;
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mv = new MapView(this, GMAP_KEY);//Google MapsのAPI KEYを設定
    setContentView(mv);
  }
}

com.google.android.mapsを利用する場合はAndroidManifest.xmlにuses-libraryを追記する必要があります。

ステータスバーの引き出し

0.9betaから上部のステータスバー部分をドラッグで開けるようになりました。
API DemosではNotificationを利用するとツールバーを利用出来ているようです。
#これが普通の利用方法なのか不明です(汗

//ステータスバーの通知表示
Notification notification =
    new Notification(R.drawable.icon, TEXT, System.currentTimeMillis());
 
//開いたステータスバーをクリックした時に起動するActivityをIntentとして持つ
PendingIntent contentIntent = 
    PendingIntent.getActivity(this, 0, new Intent(this, DrawNavi.class), 0);
 
//ステータスバーを開いた時のタイトルとテキストとIntentを設定する
notification.setLatestEventInfo(this, TITLE, TEXT, contentIntent);
 
//通知する
mNotificationManager.notify(APP_ID, notification);//第一引数はアプリ固有の数値

NotificationManager.notify()の第一引数はアプリケーション固有の任意の数字です。

Notificationはアプリケーションが終了しても表示され続けます。
なので、必要なければアプリケーション終了時に削除しておくと良いと思います。

@Override
public void onStop() {
  super.onStop();
  mNotificationManager.cancel(APP_ID);//アプリ固有の数値を指定してキャンセル
}
メニューの設定

0.9betaからメニューの追加が少し変わりました。
追加したメニューアイテム毎にイベントを設定できるようになりました。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  // メニューを追加
  item = menu.add(GROUP1, IM_HERE, IM_HERE, "I'm here").setIcon(R.drawable.icon);
 
  // im here menuがクリックされた時のイベント
  item.setOnMenuItemClickListener(new OnMenuItemClickListener() {
    public boolean onMenuItemClick(MenuItem item) {
      //{{ メニューアイテムがタップされた時の動作 }}
      return false;
    }
  });
}

Menu.add()の引数は順に「グループID」「アイテムID」「表示順番」「メニュータイトル」となっています。
0.9betaではMenu.add()の返り値はandroid.view.MenuItemとなっています。
そのオブジェクトに対してsetIcon()でアイコンを設定しています。
#ActionScript3のようなプログラミングモデルですね。

ちなみにM5と同様に、メニューアイテムのタップイベントメソッドも準備されています。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch(item.getItemId()) {
  case XXXX:
    //{{ メニューアイテムがタップされた時の動作 }}
  break
  }
  return super.onOptionsItemSelected(item);
}

どちらで実装しても意図する動作を実現できました。

P2P

M5ではGTalk用APIが準備されていたのですが、0.9betaではセキュリティの問題で削除されました。
なので、「イマドキのAndroidアプリケーション開発方法」と同様にsmack.jarというXMPPを利用する外部ライブラリを使います。ライブラリへのPATHを設定する必要があります。

まずはログイン。たった4行(例外処理なし)でログイン可能です。

private final static String HOST = "talk.google.com";
private final static int PORT = 5222;
private final static String SERVICE = "gmail.com";
 
{
  ConnectionConfiguration config = new ConnectionConfiguration(HOST, PORT, SERVICE);
  XMPPConnection connection = new XMPPConnection(config);
  connection.connect();
  connection.login(USERNAME, PASSWORD);
}

XMPPプロトコルを利用しますので、サーバにプレゼンス通知が可能です。

//利用可能(available)である事をサーバに通知
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);

何かを送信するときには統一してsendPacket()メソッドを使います。

メッセージ送信も簡単です。

void sendMessage(String text) {
  // 送信先アドレスとメッセージの種類を設定
  Message msg = new Message(RECIPIENT, Message.Type.chat);
 
  // 送信メッセージの設定
  msg.setBody(text);
 
  // 送信
  connection.sendPacket(msg);
}

メッセージ送信する時もやっぱりsendPacket()メソッドを使います。
メソッドが統一されていると分かりやすいですね。

メッセージを受信したときのイベント処理も簡単です。

//受信メッセージタイプでフィルタリング(チャットメッセージだけ受取る)
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
 
// チャットテキストを受け取った時の動作
connection.addPacketListener(new PacketListener() {
  public void processPacket(Packet packet) {
    Message message = (Message) packet;
    // {{ メッセージを受け取った時の処理 }}
  }
}, filter);

DrawNaviでは、このP2Pを利用して、自分の位置や描いた道順を送受信しています。

AndroidManifest.xml

0.9betaではまたもやAndroidManifest.xmlの記述ルールが変更になりました。
セキュリティがより厳密になったと言えます。

Mapやインターネットを使いますので、以下のタグを追加する必要があります。

<manifest>
  <application>
    <!-- アプリケーションに関する値 -->
    <uses-library android:name="com.google.android.maps" />
  </application>
  <uses-permission android:name="android.permission.INTERNET" />
</manifest>

uses-libraryタグは利用するライブラリを指定しています。
com.google.android.mapsはAndroidの標準ライブラリではないため、このように指定する必要があります。
詳しくはcom.google.android.mapsを参照下さい。
#mapsライブラリを標準にしなかったのは、mapsが重いからでしょうか?
#標準ライブラリが肥大化してモバイルに乗らなかったJavaSEの反省でしょうか?
#ちょっと面倒ですが、自分のアプリを少しでも軽くしたいので良い施策ではないかと思います。

インターネットの利用をパーミッションで設定します。
他のパーミッションについてはandroid.Manifest.permissionを参照下さい。

ダウンロード

いつものようにeclipseのプロジェクトを公開しますので、自由にご利用下さい。
draw_navi_0.9b.zip

おわりに

DrawNaviは第7回Android勉強会でサイバードさんがアイデアを出された「俺ナビ」をベースにしています。
私が登壇した第8回Android勉強会で発表するため、プロトタイプを実装(当時はM5で実装)しました。
それをデモとして披露させて頂きました。サイバードさん、改めてありがとうございました。

そのプロトタイプを0.9beta対応するとともに、ソースコードも整理しました。
0.9beta以降ではAndroid-SDKに大きな変更はないらしいので、そろそろライブラリを作ろうかな…
と思っていたので、かなり力を入れてリファクタリングしましたw

というか、以前(M5)のソースはかなり汚い…
そんなソースコードをサイバードの中の人に送ってしまった…スミマセン(汗

Home

Search
Feeds
Meta

Return to page top