SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術

YOLPで挑戦~Android向け簡易道のり測定アプリを30分で作る!

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術(1)


  • X ポスト
  • このエントリーをはてなブックマークに追加

簡易ルート検索アプリを作る

 以下は、今回作成する簡易ルート検索アプリのソースコードの全容となります。

 <あなたのアプリケーションID>の部分はご自分で取得されたアプリケーションIDに書き換えてください。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.android.app.my.RouteSearch"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:configChanges="orientation|keyboardHidden"
            android:launchMode="singleTask"
            android:label="@string/app_name"
            android:name=".RouteSearchActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission>
    <!-- MapViewを使用するのに必要な設定 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" android:resizeable="true"></supports-screens>
</manifest>
RouteSearchActivity.java
package jp.android.app.my.RouteSearch;

import jp.co.yahoo.android.maps.GeoPoint;
import jp.co.yahoo.android.maps.MapActivity;
import jp.co.yahoo.android.maps.MapController;
import jp.co.yahoo.android.maps.MapView;
import jp.co.yahoo.android.maps.PinOverlay;
import jp.co.yahoo.android.maps.routing.RouteOverlay;
import jp.co.yahoo.android.maps.routing.RouteOverlay.RouteOverlayListener;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Color;
import android.location.*;
import android.os.Bundle;
import android.view.*;
import android.view.ViewGroup.*;
import android.widget.*;

public class RouteSearchActivity extends MapActivity implements LocationListener, RouteOverlayListener, MapView.MapTouchListener{
    private MapView mMapView=null;//Y地図View
    private PinOverlay mPinOverlay=null;//開始位置のピン
    private RouteOverlay mRouteOverlay=null;//ルート検索Overlay
    private GeoPoint mStartPos;//出発地(緯度経度)
    private GeoPoint mGoalPos;//目的地(緯度経度)
    private ProgressDialog mProgDialog = null;//プログレスダイアログ
    private TextView mDistLabel=null;//距離表示用テキストビュー
    private LocationManager mLocationManager = null;//ロケーションマネージャー
    private static final int MENUITEM_CLEAR = 1;//メニュー(クリア)
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //現在位置 (NETWORK)
        mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000,0,this);
        //プログレスダイアログを表示
        mProgDialog = new ProgressDialog(this);
        mProgDialog.setMessage("現在位置取得中");
        mProgDialog.show();
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        //クリアメニューを追加
        menu.removeItem(MENUITEM_CLEAR);
        menu.add(0, MENUITEM_CLEAR, 0, "クリア");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //メニュー選択処理
        switch (item.getItemId()) {
            case MENUITEM_CLEAR:
                //地図上からルートと距離表示をクリア
                if(mMapView!=null){
                    mMapView.removeOverlay(mRouteOverlay);
                    mRouteOverlay = null;
                    if(mDistLabel!=null) mDistLabel.setVisibility(View.INVISIBLE);
                }
                return true;
        }
        return false;
    }

    //ロケーション情報取得
    public void onLocationChanged(Location location) {
        //プログレスダイアログを停止
        if(mProgDialog!=null){
            mProgDialog.dismiss();
            mProgDialog = null;
        }
        //LocationManagerを停止
        mLocationManager.removeUpdates(this);

        //MapViewを作成
        mMapView = new MapView(this,"<あなたのアプリケーションID>");
        
        //地図の表示位置をLocationManagerで取得した位置に変更
        MapController mapController = mMapView.getMapController();
        GeoPoint centerPos = new GeoPoint((int)(location.getLatitude()*1E6), (int)(location.getLongitude()*1E6));
        mapController.setCenter(centerPos);
        
        //ズームレベルをセット
        mapController.setZoom(4);
        
        //地図上で長押しイベントの発行を許可する
        mMapView.setLongPress(true);
        
        //MapTouchListenerを設定
        mMapView.setMapTouchListener(this);
       
        //LocationManagerで取得した位置にピンを立てる
        mPinOverlay = new PinOverlay(PinOverlay.PIN_VIOLET);
        mMapView.getOverlays().add(mPinOverlay);
        mPinOverlay.addPoint(centerPos,null);
 
        //LocationManagerで取得した位置をルート開始位置とします
        mStartPos = centerPos;
        
        //MapViewをカレントビューに追加
        setContentView(mMapView);
    }
    
    //MapView.MapTouchListener::onLongPress 地図の長押しイベント
    public boolean onLongPress(MapView map, Object obj, PinOverlay pin,GeoPoint point) {
        //前回の処理を停止
        if(mRouteOverlay!=null) mRouteOverlay.cancel();
        //目的地を設定
        mGoalPos = point;
        
        //長押しピンをクリア onLongPressが発生すると自動的にピンが追加されるので、ここで削除しておきます。
        mMapView.removeOverlay(pin);
        
        //前回のRouteOverlayを地図から削除
        mMapView.removeOverlay(mRouteOverlay);
        
        //距離テキストビューを非表示
        if(mDistLabel!=null) mDistLabel.setVisibility(View.INVISIBLE);
        
        //RouteOverlay作成
        mRouteOverlay = new RouteOverlay(this,"<あなたのアプリケーションID>");
         
        //出発地ピン吹き出し設定
        mRouteOverlay.setStartTitle("出発地");
        
        //目的地ピン吹き出し設定
        mRouteOverlay.setGoalTitle("目的地");
        
        //出発地、目的地、移動手段を設定
        mRouteOverlay.setRoutePos(mStartPos, mGoalPos, RouteOverlay.TRAFFIC_WALK);

        //RouteOverlayListenerの設定
        mRouteOverlay.setRouteOverlayListener(this);
         
        //検索を開始
        mRouteOverlay.search();
        
        //MapViewにRouteOverlayを追加
        mMapView.getOverlays().add(mRouteOverlay);
        
        return false;
    }


    public boolean onTouch(MapView arg0, MotionEvent arg1) {
        // TODO Auto-generated method stub
        return false;
    }

    //ルート検索エラー
    public boolean errorRouteSearch(RouteOverlay arg0, int arg1) {
        //プログレスダイアログを消します
        if(mProgDialog!=null){
            mProgDialog.dismiss();
            mProgDialog = null;
        }
        return false;
    }

    //ルート検索完了
    public boolean finishRouteSearch(RouteOverlay routeOverlay) {
        //プログレスダイアログを消します
        if(mProgDialog!=null){
            mProgDialog.dismiss();
            mProgDialog = null;
        }

        //距離テキストビューを表示
        if(mDistLabel!=null){
            mDistLabel.setVisibility(View.VISIBLE);
        }else{
            mDistLabel = new TextView(this);
            this.addContentView(mDistLabel, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        }
        mDistLabel.setTextSize(20);
        mDistLabel.setTextColor(Color.argb(255, 255, 255, 255));
        mDistLabel.setBackgroundColor(Color.argb(127, 0, 0, 0));
        
        //距離を設定
        mDistLabel.setText(String.format("距離 %.3fキロメートル",(routeOverlay.getDistance()/1000)));
        return false;
    }

    public void onProviderDisabled(String provider) {
    }

    public void onProviderEnabled(String provider) {
    }
    
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

次のページ
AndroidManifest.xmlに必要な設定を追加

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術連載記事一覧

もっと読む

この記事の著者

大江 啓之(ヤフー株式会社)(オオエ ヒロユキ(ヤフーカブシキガイシャ))

2008年ヤフー入社後、ソフトバンクモバイル版地図アプリ、ドコモ版地図アプリ、BREW版路線・地図アプリなどの携帯アプリの開発を手掛け、「Yahoo! Open Local Platform(略称:YOLP)」のスマートフォン向け地図SDK(iOS Map SDK&Android Map SDK)の...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6406 2012/02/29 19:12

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング