【Flutter】位置情報を取得する方法 | ヒヨコ プログラミング(ヒヨプロ)

【Flutter】位置情報を取得する方法

Flutter

スマートフォンアプリでは、現在地を取得して地図に表示したり、特定のエリアに入ったことを検知したりする機能がよく使われます。例えば、ナビゲーションアプリやチェックイン機能を持つアプリなど、さまざまな場面で位置情報が活用されています。

本記事では、Flutter の geolocator パッケージを使った位置情報の取得方法について、基本から紹介します!

パッケージのインストール

まずは geolocator パッケージをインストールしましょう。

パッケージのインストール方法は、以下の記事で詳しく紹介していますので、ご参照ください。

プラットフォームごとの設定

位置情報を取得するためには、Android / iOS それぞれに権限設定が必要です。

Androidの設定

android/app/build.gradle の compileSdkVersion を 以下のように変更します。

android {
  compileSdkVersion 34

  ...
}

また、android/app/src/main/AndroidManifest.xml に ACCESS_FINE_LOCATION と ACCESS_COARSE_LOCATION のパーミッションを追記します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
   <application
      …

iOSの設定

ios/Runner/info.plist に以下の2行を追記します。

    …
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>アプリで位置情報を利用する理由を書く</string>
</dict>
</plist>

位置情報の取得

上記の設定が終わったら、geolocator を使用して位置情報を取得することができます。
現在地の位置情報を取得し、画面に表示する実装例が下記のソースコードです。

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class LocationSample extends StatefulWidget {
  const LocationSample({super.key});

  @override
  State<LocationSample> createState() => _LocationSampleState();
}

class _LocationSampleState extends State<LocationSample> {
  String _locationMessage = "位置情報を取得していません";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
          title: const Text("現在地の確認"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(_locationMessage),
            const Padding(padding: EdgeInsets.all(15)),
            ElevatedButton(
              onPressed: _getCurrentLocation,
              child: const Text("位置情報を取得"),
            ),
          ],
        ),
      ),
    );
  }

  // 位置情報を取得する関数
  Future<void> _getCurrentLocation() async {
    // 位置情報サービスが有効か確認
    bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      setState(() {
        _locationMessage = "位置情報サービスが無効です";
      });
      return;
    }

    // 権限を確認
    LocationPermission permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        setState(() {
          _locationMessage = "位置情報の権限が拒否されました";
        });
        return;
      }
    }

    if (permission == LocationPermission.deniedForever) {
      setState(() {
        _locationMessage = "位置情報の権限が永久に拒否されています";
      });
      return;
    }

    // 位置情報を取得
    Position position = await Geolocator.getCurrentPosition();
    setState(() {
      _locationMessage = "緯度: ${position.latitude}, 経度: ${position.longitude}";
    });
  }
}

ボタンをタップし、表示されるパーミッションを許可して現在地の位置情報を取得した実行例が以下になります。

緯度は、プラス値が北緯、マイナス値が南緯
経度は、プラス値が東経、マイナス値が西経 となっています。

取得した位置情報を表示した実行例

まとめ

Flutter の geolocator パッケージを使った位置情報の取得方法について紹介しました!

  • geolocator パッケージを使用することで、権限の管理を含めた位置情報の取得を簡単に行うことができる
  • Android / iOS それぞれの設定は必要
  • Geolocator.getCurrentPosition() で現在地の取得を行う

以上で、【Flutter】位置情報を取得する方法 は終わりです。

おすすめ書籍

コメント

タイトルとURLをコピーしました