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

【Android】ネットワークプロバイダー(NETWORK_PROVIDER)を使って緯度を取得する方法

本記事では、Androidアプリでネットワークプロバイダー(Network Provider)を使用して、端末の現在位置の緯度(latitude)を取得する方法をサンプルコード付きで解説します。ネットワークプロバイダーはWi-Fiや携帯基地局の情報をもとに位置を特定するため、GPS電波が届きにくい屋内環境でも比較的安定して位置情報を取得できるのが特徴です。

手順1:Android Studioで新規プロジェクトを作成する

Android Studioを起動し、File ⇒ New Projectを選択して新しいプロジェクトを作成します。必要事項をすべて入力して、プロジェクトのセットアップを完了させてください。

手順2:レイアウトファイル(res/layout/activity_main.xml)を編集する

次のコードを activity_main.xml に追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   xmlns:tools="https://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:gravity="center"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
<TextView
   android:id="@+id/text"
   android:textSize="30sp"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />
</LinearLayout>

上記のコードでは、取得した緯度を画面に表示するための TextView を1つ配置しています。

手順3:MainActivity.java を実装する

次のコードを src/MainActivity.java に追加します。

package com.example.myapplication;

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

public class MainActivity extends AppCompatActivity {
   TextView textView;
   Location location;
   double latitude;

   @RequiresApi(api = Build.VERSION_CODES.P)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      textView = findViewById(R.id.text);
      LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
         PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
         this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(this, new String[]{
            Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
         }
         location = locationManager
         .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    }

      @RequiresApi(api = Build.VERSION_CODES.O)
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      switch (requestCode) {
         case 101:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                  PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                  this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                  return;
                 }
               latitude = location.getLatitude();
               textView.setText("" + latitude);
            } else {
               //not granted
            }
            break;
            default:
               super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      }
   }

   @RequiresApi(api = Build.VERSION_CODES.O)
   @Override
   protected void onResume() {
      super.onResume();
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
         PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
         this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         return;
      }
      latitude = location.getLatitude();
      textView.setText("" + latitude);
   }
}

このコードのポイントは以下のとおりです。

  • LocationManager のインスタンスを取得し、getLastKnownLocation(LocationManager.NETWORK_PROVIDER) によってネットワークプロバイダーが保持する「最終既知位置」を取得します。
  • 位置情報パーミッション(ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION)が未許可の場合は、requestPermissions() でユーザーに許可を求めます。
  • 許可された後は onRequestPermissionsResult()onResume() 内で location.getLatitude() を呼び出し、取得した緯度を TextView に表示します。

手順4:AndroidManifest.xml にパーミッションを追加する

次のコードを AndroidManifest.xml に追加します。

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

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

   <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>

ここでは、おおよその位置情報取得に必要な ACCESS_COARSE_LOCATION パーミッションと、ネットワーク通信に必要な INTERNET パーミッションなどを宣言しています。

注意: Android 6.0(API 23)以降では、位置情報パーミッションはインストール時だけでなく実行時にユーザーの許可を得る必要があります。また、実機でテストする場合は、あらかじめ端末の設定から位置情報サービスをオンにしておきましょう。

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

それでは、実際にアプリを実行してみましょう。実機のAndroidスマートフォンをPCに接続している前提で説明します。Android Studioからアプリを実行するには、プロジェクト内のアクティビティファイルを開き、ツールバーの実行(Run)アイコンをクリックしてください。デバイス選択のダイアログが表示されたら、接続中のモバイルデバイスを選択します。すると実機側にアプリが起動し、ネットワークプロバイダーから取得した緯度が画面に表示されます。

  1. Androidでコンテンツプロバイダーから連絡先の電話番号を取得する方法

    はじめにこの記事では、Androidアプリでコンテンツプロバイダー(Content Provider)を使って、端末内の連絡先から電話番号を取得する方法を解説します。連絡先データへアクセスするには、ContactsContract を使ったクエリの発行に加えて、READ_CONTACTS 権限のランタイムリクエストが必要です。以下の手順では、連絡先の一覧を ListView に表示し、項目をタップすると対応する電話番号を Toast で表示するサンプルアプリを作成していきます。ステップ1:新規プロジェクトの作成Android Studioを起動し、メニューから「File」⇒「New Proje

  2. AndroidアプリでURLからビットマップ(Bitmap)を取得する方法を解説

    はじめにこの記事では、Androidアプリで指定したURLからビットマップ画像を取得して画面に表示する方法を、サンプルコードとともに段階的に解説します。ネットワーク上の画像を取得する処理は、AsyncTaskを使ってバックグラウンドで実行するのがポイントです。手順1:新しいプロジェクトを作成するまず、Android Studioを開き、「File」→「New Project」を選択して、必要な情報を入力し、新しいプロジェクトを作成します。手順2:レイアウトファイル(activity_main.xml)を編集する次に、res/layout/activity_main.xmlに以下のコードを追加し