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) {
}
}
この記事が気に入ったらサポートをしてみませんか?