見出し画像

GPSで現在地の緯度・経度を取得するAndroidアプリを作る


はじめに

Androidで位置情報を取得する手順をまとめたノートです。GPSで現在地の緯度・経度を取得するAndroidアプリが作れるようになります 。初心者の人にも分かりやすいように丁寧にまとめました。

開発の流れ

1. ユーザーのデータ(位置情報)へのアクセスを許可する
2. 位置情報を取得するリスナーの登録をする
3. 位置情報を管理するLocationManagerのインスタンスを生成
4. コールバック関数の実装
  - onResume()
  - onStop()
  - onLocationChanged()
  - 今回は処理を書かないコールバック関数
5. 実行してみよう!



1. ユーザーのデータ(位置情報)へのアクセスを許可する

AndroidManifest.xmlに以下を追記します。

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

android.permission.INTERNET
通信を利用できます。

android.permission.ACCESS_FINE_LOCATION
GPSやWi-Fi、電波塔などから正確な位置情報へのアクセスができます。

追記後

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



2. 位置情報を取得するリスナーの登録をする

以下のように、LocationListenerを登録します。

public class MainActivity extends AppCompatActivity implements LocationListener {

}

LocationListenerを登録すると、赤い波線が表示されます。
これは、LocationListenerを利用する際には、いくつかのメソッドをオーバライド(上書き)する必要があるからです。

以下に、赤い波線の解決方法を示します。

赤い波線の解決後

public class MainActivity extends AppCompatActivity implements LocationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onLocationChanged(Location location) {
        
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}


onLocationChanged()
onStatusChanged()onProviderEnabled()onProviderDisabled()の4つのコールバック関数が追加されています。それぞれのコールバック関数の役割は、後ほど説明します。


3. 位置情報を管理するLocationManagerのインスタンスを生成

MainActivity.javaにコードを書いていきます。ついでに、緯度・経度を表示するテキストビューのコードも書きます。

public class MainActivity extends AppCompatActivity implements LocationListener {

    private LocationManager manager;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }


getSystemService

LocationManagerクラスのインスタンスを取得します。


4. コールバック関数の実装

Androidがアプリからイベントを受信した際に呼ばれるコールバック関数の実装を行います。

いよいよGPSで現在地の位置情報を取得するコードを書いていきます。

4-1. onResume()

onResume()は、ユーザとの対話(やり取り)をする直前に呼ばれます。

onLocationChanged()の上あたりにonResume()を実装します。

@Override
    protected void onResume() {
        super.onResume();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            return;
        }

        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
        manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 1, this);
    }

checkSelfPermission
指定したパーミッションが許可されているか確認します。
ここでは、指定したパーミッション(ACCESS_FINE_LOCATION)の値が「PERMISSION_GRANTED」かどうか、確かめています。

requestPermission
パーミッションの許可を依頼します。
写真のようなシステムダイアログが表示されます。


requestLocationUpdates

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener));

指定した情報を元に、位置情報の取得リクエストを開始します。
引数には順に、プロバイダ(GPSやNETWORK)、最小時間間隔(ミリ秒)、最小距離間隔(メートル)、登録したリスナーを指定します。

今回は位置情報の取得を、GPSで取得する方法と、GPSが利用できないときの為に、ネットワークから取得する方法を実装しています。


4-2. onStop()

onStop()は、新たなアクティビティ(画面)が開始して、現在のアクティビティ(画面)が表示されなくなったときに呼ばれます。

onResume()の下あたりにonStop()を実装します。

@Override
    protected void onStop() {
        super.onStop();

        if (manager != null) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            manager.removeUpdates(this);
        }
    }


removeUpdates
位置情報の取得処理を終了します。


4-3. onLocationChanged()

onLovcationChanged()は、位置情報が更新されたときに呼ばれます。

@Override
    public void onLocationChanged(Location location) {
        String text = "緯度:" + location.getLatitude() + "経度:" + location.getLongitude();
        textView.setText(text);
}


getLatitude
緯度を取得します。

getLongitude
経度を取得します。


4-4. 今回は処理を書かないコールバック関数

特に処理は書きませんが、役割を説明します。

・onStatusChanged():プロバイダのステータスが変更されたとき呼ばれる
(補足)圏外になったり、一時的にプロバイダが利用できなかったり、プロバイダが利用可能になったときに呼ばれます。

・onProviderEnabled():ユーザがプロバイダを有効化したとき呼ばれる

・onProviderDisabled():ユーザがプロバイダを無効化したとき呼ばれる


5. 実行してみよう!

GPSで現在地の緯度・経度を取得することができました!!


あとがき

ご意見、ご感想等ありましたら、下記までお願いします。


ソースコード

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements LocationListener {

    private LocationManager manager;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            return;
        }

        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
        manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 1, this);
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (manager != null) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            manager.removeUpdates(this);
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        String text = "緯度:" + location.getLatitude() + "経度:" + location.getLongitude();
        textView.setText(text);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

この記事が気に入ったらサポートをしてみませんか?