Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidアプリで位置情報サービス(GPS)が有効になっているか確認する方法

本記事では、Androidアプリ内で位置情報サービスが有効になっているかどうかをプログラムから判定する方法を解説します。LocationManagerクラスを使用してGPSおよびネットワークプロバイダの有効状態をチェックし、両方とも無効の場合にユーザーを位置情報の設定画面へ誘導するダイアログを表示する実装を見ていきましょう。

ステップ1:Android Studioで新規プロジェクトを作成する

まず、Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力してプロジェクトの雛形を生成してください。

ステップ2:res/layout/activity_main.xml にコードを追加する

レイアウトファイルには、位置情報の有効状態をチェックするためのボタンを1つ配置します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Enable Location" />

</RelativeLayout>

ステップ3:src/MainActivity.java にコードを追加する

次に、メインアクティビティに位置情報サービスの状態を判定する処理を実装します。isProviderEnabled()メソッドでGPSプロバイダとネットワークプロバイダそれぞれの状態を取得し、どちらも無効であればアラートダイアログを表示して設定画面への遷移を促します。

package app.tutorialspoint.com.sample;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                locationEnabled();
            }
        });
    }

    private void locationEnabled() {
        LocationManager lm = (LocationManager)
                getSystemService(Context.LOCATION_SERVICE);
        boolean gps_enabled = false;
        boolean network_enabled = false;

        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (!gps_enabled && !network_enabled) {
            new AlertDialog.Builder(MainActivity.this)
                    .setMessage("GPS Enable")
                    .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                            startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                        }
                    })
                    .setNegativeButton("Cancel", null)
                    .show();
        }
    }
}

ステップ4:AndroidManifest.xml にコードを追加する

位置情報を扱うためには、マニフェストファイルにACCESS_FINE_LOCATION(高精度の位置情報)とACCESS_COARSE_LOCATION(おおよその位置情報)のパーミッション宣言が必要です。忘れずに追記しておきましょう。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.tutorialspoint.com.sample">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_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>
</manifest>

アプリを実行して動作を確認する

それでは、アプリケーションを実行してみましょう。ここでは、実際のAndroidスマートフォンをパソコンに接続しているものとして説明します。Android Studioからアプリを起動するには、プロジェクト内のアクティビティファイルをいずれか開き、ツールバーにある「Run」アイコンをクリックしてください。

実行デバイスの選択ダイアログで接続中のモバイル端末を選択すると、端末側にアプリの初期画面が表示されます。

Androidアプリで位置情報サービス(GPS)が有効になっているか確認する方法

補足:実装のポイント

  • GPS_PROVIDER:衛星(GPS/GLONASSなど)を利用した高精度な測位方式です。
  • NETWORK_PROVIDER:Wi-Fiアクセスポイントや携帯基地局の情報を利用した測位方式です。
  • サンプルコードは旧サポートライブラリ(android.support.v7)を使用しています。新しいプロジェクトではAndroidX(androidx.appcompat.app.AlertDialogなど)への置き換えを推奨します。
  • より最新の手法としては、Google Play開発者サービスのSettingsClientSettingsApi)を利用して、位置設定の確認と有効化をユーザーに促す方法もあります。
  1. Androidの位置情報を偽装する方法|開発者向けオプションの設定からおすすめアプリまで徹底解説

    位置情報を活用したアプリを開発しているAndroidデベロッパーなら、機能が正しく動作するかを確認するために、スマートフォンの位置情報を偽装(スプーフィング)する必要があるかもしれません。実は、開発者でなくてもこの機能は簡単に利用できます(Androidの場合。iPhoneはやや手間がかかります)。これにより、地理的制限(ジオブロック)の回避、アプリのテスト、友人へのいたずら、監視の回避など、さまざまな可能性が広がります。サハラ砂漠を歩いていることにしたり、カナダ・マニトバ州でヘラジカと駆け抜けたり、タイタニック号に潜ったり……実際には移動していなくても、周囲にはそう「見せる」ことができるので

  2. AndroidでGPS位置情報を偽装する方法|アプリ・VPNを使った3つのテクニック

    すべてのAndroid端末にはGPS機能が搭載されており、Googleマップ、Uber、Facebook、Zomatoなどのアプリがあなたの現在地を追跡できるようになっています。GPSによる位置情報は、天気予報、地域のニュース、交通状況、近くのお店やイベント情報など、現在地に関連した情報を受け取るために非常に便利です。しかし、自分の位置情報が第三者や政府機関にアクセス可能な状態になっているという事実に不安を感じる人も少なくありません。また、位置情報によって地域限定コンテンツへのアクセスが制限されることもあります。例えば、自国では配信されていない映画を見たい場合、実際の所在地を隠すことが唯一の解