質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

3127閲覧

onLocationChanged()メソッドの引数について /android開発

doroidon

総合スコア4

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/06/10 08:21

書籍でandroidアプリ開発(kotlin)を学習中です。
下は公開されているサンプルコードです。

この中で * ロケーションリスナクラス。 と記載されている箇所についてです(やや下の方)。

書籍の解説には以下の記載があります。

"onLocationChanged()の引数のLocationオブジェクトにプロバイダ(今の設定ではGPS)から取得した位置情報が格納されています。Locationオブジェクトのlatitudeプロパティ、およびlongitudeプロパティで緯度、経度が取得できるので、取得した緯度、経度を> フィールドに格納します。

ここから質問なのですが、onLocationChanged()メソッドの引数には自動的にLocationオブジェクトが渡されているという理解で間違っていないでしょうか。
また、仮にそうだとしてLocationオブジェクトはどこで生成されているのでしょうか?
そもそも、理解が間違っていたなら指摘を頂けると嬉しいです。

よろしく、お願いします。

package com.websarva.wings.android.implicitintentsample import android.Manifest import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.location.Location import android.location.LocationListener import android.location.LocationManager import android.net.Uri import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v4.app.ActivityCompat import android.view.View import android.widget.EditText import android.widget.TextView import java.net.URLEncoder /** * 『Androidアプリ開発の教科書』 * 第14章 * 暗黙的インテントサンプル * * アクティビティクラス。 * * @author Shinzo SAITO */ class MainActivity : AppCompatActivity() { /** * 緯度フィールド。 */ private var _latitude = 0.0 /** * 経度フィールド */ private var _longitude = 0.0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //LocationManagerオブジェクトを取得。 val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager //位置情報が更新された際のリスナオブジェクトを生成。 val locationListener = GPSLocationListener() //ACCESS_FINE_LOCATIONの許可が下りていないなら… if(ActivityCompat.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //ACCESS_FINE_LOCATIONの許可を求めるダイアログを表示。その際、リクエストコードを1000に設定。 val permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION) ActivityCompat.requestPermissions(this@MainActivity, permissions, 1000) //onCreate()メソッドを終了。 return } //位置情報の追跡を開始。 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener) } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { //ACCESS_FINE_LOCATIONに対するパーミションダイアログでかつ許可を選択したなら… if(requestCode == 1000 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //LocationManagerオブジェクトを取得。 val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager //位置情報が更新された際のリスナオブジェクトを生成。 val locationListener = GPSLocationListener() //再度ACCESS_FINE_LOCATIONの許可が下りていないかどうかのチェックをし、降りていないなら処理を中止。 if(ActivityCompat.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return } //位置情報の追跡を開始。 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener) } } /** * 地図検索ボタンがタップされたときの処理メソッド。 */ fun onMapSearchButtonClick(view: View) { //入力欄に入力されたキーワード文字列を取得。 val etSearchWord = findViewById<EditText>(R.id.etSearchWord) var searchWord = etSearchWord.text.toString() //入力されたキーワードをURLエンコード。 searchWord = URLEncoder.encode(searchWord, "UTF-8") //マップアプリと連携するURI文字列を生成。 val uriStr = "geo:0,0?q=${searchWord}" //URI文字列からURIオブジェクトを生成。 val uri = Uri.parse(uriStr) //Intentオブジェクトを生成。 val intent = Intent(Intent.ACTION_VIEW, uri) //アクティビティを起動。 startActivity(intent) } /** * 現在地の地図表示ボタンがタップされたときの処理メソッド。 */ fun onMapShowCurrentButtonClick(view: View) { //フィールドの緯度と経度の値をもとにマップアプリと連携するURI文字列を生成。 val uriStr = "geo:${_latitude},${_longitude}" //URI文字列からURIオブジェクトを生成。 val uri = Uri.parse(uriStr) //Intentオブジェクトを生成。 val intent = Intent(Intent.ACTION_VIEW, uri) //アクティビティを起動。 startActivity(intent) } /** * ロケーションリスナクラス。 */ private inner class GPSLocationListener : LocationListener { override fun onLocationChanged(location: Location) { //引数のLocationオブジェクトから緯度を取得。 _latitude = location.latitude //引数のLocationオブジェクトから経度を取得。 _longitude = location.longitude //取得した緯度をTextViewに表示。 val tvLatitude = findViewById<TextView>(R.id.tvLatitude) tvLatitude.text = _latitude.toString() //取得した経度をTextViewに表示。 val tvLongitude = findViewById<TextView>(R.id.tvLongitude) tvLongitude.text = _longitude.toString() } override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {} override fun onProviderEnabled(provider: String) {} override fun onProviderDisabled(provider: String) {} } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

onLocationChanged()メソッドの引数には自動的にLocationオブジェクトが渡されているという理解で間違っていないでしょうか。

だいたいそう思っていただいて良いと思います。requestLocationUpdates()によってロケーションの更新とその間隔や、結果を受け取るリスナーがセットされれば、それをトリガーとしてAndroidシステムの中で位置情報を定期的に取得するサービスが動作します。そして得られた情報を、セットされたリスナーを介して渡してもらえるものと考えれば良いと思います。

仮にそうだとしてLocationオブジェクトはどこで生成されているのでしょうか?

LocationManagerの中で生成されています(多分)。いずれにしてもユーザーが触れることのない部分です。

投稿2020/06/10 10:17

keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doroidon

2020/06/11 13:37

ありがとうございます。 自己解決の部分に追加で質問書いてしまいました。。。 もしお時間いただけるなら、お願いします!
guest

0

早速の回答ありがとうございます。
理解が間違ってなくて、ホッとしました。

ご回答を参考にリファレンスを読みとこうとしました。

わたしの理解はおかしくないでしょうか。

LocationListener には
リンク内容

Used for receiving notifications from the LocationManager when the location has changed. These methods are called if the LocationListener has been registered with the location manager service using the
と記載されているので、渡ってくる引数の内容はkeicha_hrsさんの言う通りLocationManager からやってくると理解しました

で次に、android.content.Context のリファレンスを見ると、そこには
リンク内容 

イメージ説明

とありました。

この Value:"location" というのが今回の渡ってきた内容の実体?でしょうか。

リファレンスの見方がヘンかもですが、お許しください。
よろしくお願いいたします。

投稿2020/06/11 13:34

doroidon

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2020/06/14 09:50 編集

Constant Valueというのは、その定数の実体がどのように定義されているかを記述しているだけです。ここで言えば、LOCATION_SERVICEはContext.javaの中で public static final String LOCATION_SERVICE = "location"; のように宣言されているということを表しています。 リファレンスの内容について深く知りたければ、ソースを追いかけてみるのも一つの手段です。Android SDKではソースファイルもインストールできるので、自分の手元のPCでリファレンスにあるAPIのソースを参照することができます。 <SDKのインストールフォルダー>\sources\android-<APIレベル>\ を参照してみましょう。今回参照されたContextクラスで言えば、ページの一番上の方に完全修飾名が"android.content.Context"のように記されているので、android→contentとフォルダーを辿れば、その下にContext.javaが存在します。
doroidon

2020/06/15 13:20

ありがとうございます。 Constant Value ってそういう意味だったんですね。。。(恥) APIソースも確認してみます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問