Google Maps Android API V2を使ってみる2


Google Maps Android API V2を使ってみる」では、Google Mapsの表示をLayoutのactive_main.xmlに記述 していましたが、今回地図の表示はMainActivity.javaにフルコードで記述してみました。

また、本番用にLegal Notices(免責事項)の表示用のコードも追加。

初期位置以外に、現在地表示の機能もありますので、初期位置に復帰するコードもつけておきました。

MainActivityのコードは、位置を指定して表示する場合と、現在位置を取得して表示する場合の2つを分けています。

使い方

Google Maps Android API V2を使ってみる では、5つほどのステップをふんでいました。

1:Maps API SDKのインストール(Google Play servicesのライブラリをEclipseにインポート)
2:Google Play servicesライブラリのプロジェクトを作成
3:Google Maps V2を表示するアプリのプロジェクトを作成
4:MapsのAPIキー取得
5:取得したキーをプロジェクトに登録して、アプリをスマホにインストール

今回は単純に3:のみ記述しておきます。


新しいプロジェクトを作成

メニュのFile -> New -> Projectで新しいプロジェクトを作成。

「Android Application Project」を使います。

gmap_androidapiv2II-1

画像の情報は例です。適当に変えてください。

Targetは2.3.3以上です。
Themeはなしにしておきます。

gmap_androidapiv2II-2

以後、Nextをクリックして、最後にFinish。

Package Explorerに表示されたプロジェクト名を右クリックして、「Properties」を選択。

「is Library」にチェックが入っていないのを確認して「Add」をクリック。

gmap_androidapiv2II-3

「google-play-services_lib」を選んで、OK。

gmap_androidapiv2II-4

Google Maps v2を表示するため、今回は3つのファイルをいじります。

○MainActivity.java

○AndroidManifest.xml

○activity_main.xml

メニュの部分で、Legal Noticesの表示と、初期位置に復帰するコードを記述しておきました。

MainActivity.java(位置を指定して表示)

import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog;
import android.app.Dialog;
import android.util.Log;
import android.widget.Toast;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.ConnectionResult;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.model.CameraPosition;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;

import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;

import    android.widget.TextView;

public class MainActivity extends FragmentActivity {
    
    private SupportMapFragment mapFragment;
    private static final String HOGE_MAP_FRAGMENT_TAG = "maps_fragment";
    
    private GoogleMap gMap;
    public double latitude = 0;
    public double longitude = 0;
    
    private static final int MENU_A = 0;
    private static final int MENU_B = 1;
        
    private static final int RQS_GooglePlayServices = 1;
    
    private TextView textview;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textview = (TextView) findViewById(R.id.tv_location);
        
        //Google Play Servicesが使えるかどうかのステータス
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
 
        // Showing status
        if(status!=ConnectionResult.SUCCESS){ 
            // Google Play Services が使えない場合
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();
 
        }else { 
            // Google Play Services が使える場合
            //activity_main.xmlのSupportMapFragmentへの参照を取得
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            
            //fragmentからGoogleMap objectを取得
            gMap = fm.getMap();
            
            //Google MapのMyLocationレイヤーを使用可能にする
            gMap.setMyLocationEnabled(true);
            gMap.setIndoorEnabled(true);
            gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            gMap.setTrafficEnabled(true);
            
            
            
            //システムサービスのLOCATION_SERVICEからLocationManager objectを取得
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            
            //retrieve providerへcriteria objectを生成
            Criteria criteria = new Criteria();
            
            //Best providerの名前を取得
            String provider = locationManager.getBestProvider(criteria, true);
            
            
        }   
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.activity_main, menu);
        
        menu.add(0, MENU_A,   0, "Home");
        menu.add(0, MENU_B,   0, "Legal Notices");
        return true;
    }
    
    public boolean onOptionsItemSelected(MenuItem item) {
        switch ( item.getItemId() ){
            case MENU_A:
                //復帰
                LatLng HOME = new LatLng(35.02878398517723,135.77929973602295);
                moveCamera2Target(true,HOME,18.0f,60.0f,0.0f);
                return true;
                
            case MENU_B:
                //Legal Notices
                String LicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getApplicationContext());
                AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MainActivity.this);
                LicenseDialog.setTitle("Legal Notices");
                LicenseDialog.setMessage(LicenseInfo);
                LicenseDialog.show();
                
                return true;
        }
        return false;
    }
    
    @Override
        protected void onResume(){
 
            super.onResume();
            
            
            int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

            if (resultCode == ConnectionResult.SUCCESS){
                
                Toast.makeText(getApplicationContext(), 
                "isGooglePlayServicesAvailable SUCCESS", 
                Toast.LENGTH_LONG).show();
                
                
                
                //初期位置
                LatLng target = new LatLng(35.02878398517723,135.77929973602295);
                
                textview.setText("35.02878398517723,135.77929973602295");
                
                //ズームレベル
                float zoom = 18.0f;
                
                //チルトアングル
                 float tilt = 90.0f; // 0.0 - 90.0
                
                //向き
                float bearing = 0.0f;
                
                //CameraUpdate
                CameraPosition pos = new CameraPosition(target, zoom, tilt, bearing);
                CameraUpdate camera = CameraUpdateFactory.newCameraPosition(pos);
                
                gMap.moveCamera(camera);
                
                //UiSettings
                UiSettings uiSet = gMap.getUiSettings();
                uiSet.setZoomControlsEnabled(true);
                uiSet.setZoomGesturesEnabled(true);
                //uiSet.setCompassEnabled(true);
                uiSet.setRotateGesturesEnabled(true); 
                
            }else{
                GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices);
                
            }
            
        }
    
    private void moveCamera2Target(boolean animation_effect,LatLng target,float zoom,float tilt,float bearing) {
        CameraPosition pos = new CameraPosition(target, zoom, tilt, bearing);
        CameraUpdate camera = CameraUpdateFactory.newCameraPosition(pos);
        
        
        
        if (animation_effect == true) {
            //
            gMap.animateCamera(camera);
        } else {
            //
            gMap.moveCamera(camera);
        }
    }
    
    
}

MainActivity.java(現在位置を取得して表示)

import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationListener;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog;
import android.app.Dialog;
import android.util.Log;
import android.widget.Toast;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.ConnectionResult;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.model.CameraPosition;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;

import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;

import    android.widget.TextView;

public class MainActivity extends FragmentActivity implements LocationListener {
    
    private SupportMapFragment mapFragment;
    private static final String HOGE_MAP_FRAGMENT_TAG = "maps_fragment";
    
    private GoogleMap gMap;
    public double latitude = 0;
    public double longitude = 0;
    
    private static final int MENU_A = 0;
    private static final int MENU_B = 1;
        
    private static final int RQS_GooglePlayServices = 1;
    
    private TextView textview;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textview = (TextView) findViewById(R.id.tv_location);
        
        //Google Play Servicesが使えるかどうかのステータス
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
 
        // Showing status
        if(status!=ConnectionResult.SUCCESS){ 
            // Google Play Services が使えない場合
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();
 
        }else { 
            // Google Play Services が使える場合
            //activity_main.xmlのSupportMapFragmentへの参照を取得
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            
            //fragmentからGoogleMap objectを取得
            gMap = fm.getMap();
            
            //Google MapのMyLocationレイヤーを使用可能にする
            gMap.setMyLocationEnabled(true);
            gMap.setIndoorEnabled(true);
            gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            gMap.setTrafficEnabled(true);
            
            
            
            //システムサービスのLOCATION_SERVICEからLocationManager objectを取得
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            
            //retrieve providerへcriteria objectを生成
            Criteria criteria = new Criteria();
            
            //Best providerの名前を取得
            String provider = locationManager.getBestProvider(criteria, true);
            
            
            //現在位置を取得
            Location location = locationManager.getLastKnownLocation(provider);
 
            if(location!=null){
                onLocationChanged(location);
            }
            locationManager.requestLocationUpdates(provider, 20000, 0, this);
            
            
        }   
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.activity_main, menu);
        
        menu.add(0, MENU_A,   0, "Home");
        menu.add(0, MENU_B,   0, "Legal Notices");
        return true;
    }
    
    public boolean onOptionsItemSelected(MenuItem item) {
        switch ( item.getItemId() ){
            case MENU_A:
                //復帰
                LatLng HOME = new LatLng(35.02878398517723,135.77929973602295);
                moveCamera2Target(true,HOME,18.0f,60.0f,0.0f);
                return true;
                
            case MENU_B:
                //Legal Notices
                String LicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getApplicationContext());
                AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MainActivity.this);
                LicenseDialog.setTitle("Legal Notices");
                LicenseDialog.setMessage(LicenseInfo);
                LicenseDialog.show();
                
                return true;
        }
        return false;
    }
    
    @Override
        protected void onResume(){
 
            super.onResume();
            
            
        }
    
    private void moveCamera2Target(boolean animation_effect,LatLng target,float zoom,float tilt,float bearing) {
        CameraPosition pos = new CameraPosition(target, zoom, tilt, bearing);
        CameraUpdate camera = CameraUpdateFactory.newCameraPosition(pos);
        
        
        
        if (animation_effect == true) {
            //
            gMap.animateCamera(camera);
        } else {
            //
            gMap.moveCamera(camera);
        }
    }
    
    
    @Override
    public void onLocationChanged(Location location) {
 
        //現在位置の緯度を取得
        latitude = location.getLatitude();
 
        //現在位置の経度を取得
        longitude = location.getLongitude();
        
        textview.setText(latitude + "," + longitude);
        //reverse_geocode(latitude,longitude);
        
        //現在位置からLatLng objectを生成
        LatLng latLng = new LatLng(latitude, longitude);
 
        //Google Mapに現在地を表示
        gMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
 
        //Google Mapの Zoom値を指定
        gMap.animateCamera(CameraUpdateFactory.zoomTo(15));
 
    }
 
    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
    
}

AndroidManifest.xml

下のコードで、「APIキー」と書かれている部分は、APIキー取得後に修正してください。

xxxxxの部分は、ご自分のパッケージ名で置き換えてください。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxxxx"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="17" />

    <uses-permission android:name="xxxxx.permission.MAPS_RECEIVE"/>

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>
        
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="APIキー" />
 
        <activity
            android:name="xxxxx.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/textview1"
        class="com.google.android.gms.maps.SupportMapFragment" />
 
</RelativeLayout>

起動時の画面
gmap_androidapiv2II-5

2D<->3D切り替えやフロアプラン、ズームなどについては、
Google Maps Android API V2を使ってみる を参照。

前回から追加された機能

ここをタップするとGPSで現在地を取得し、地図を表示します。
gmap_androidapiv2II-6
メニュです。
gmap_androidapiv2II-7
左の「Home」をタップすると、初期位置に復帰します。

右の「Legal Notices」をタップすると、免責事項についての説明を表示します。
gmap_androidapiv2II-8

その他

UiSettingsで、setRotateGesturesEnabled(true)にしておけば、2本の指で回転させるよう(ちょうどペットボトルのキャップをいじるような動き)にすると、 地図が回転します。指が2本であれば、どの指を使ってもいいのですが…。
gmap_androidapiv2II-9


Be the first to comment

Leave a Reply

Your email address will not be published.


*