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

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

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

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Android

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

Android Studio

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

Q&A

解決済

1回答

2504閲覧

Android 位置情報が取得できなくなる

nob.

総合スコア711

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

Android

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

Android Studio

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

0グッド

1クリップ

投稿2017/05/30 05:46

###前提・実現したいこと
Android4.4 でFusedLocationを用いてGPSの位置情報を取得しようとしています。

###発生している問題・エラーメッセージ
アプリ起動後、1分ほどで onLocationChanged() が呼ばれなくなります。
なぜ呼ばれなくなるのか、呼ばれ続けるようにするにはどうしたよいかがわかりません。

###該当のソースコード

package com.nob.locationlog; // 次のURLを参照して作成 // https://developer.android.com/training/location/retrieve-current.html import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.location.FusedLocationProviderApi; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MainActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener, View.OnClickListener { private final int REQUEST_PERMISSION = 10; // request code for Location Permission private final long INTERVAL = 3 * 1000; // location interval (3 * 1000)milliseconds private final long FASTEST_INTERVAL = 1 * 1000; // Fasetest Interval (1 * 1000)millisecons private GoogleApiClient mGoogleApiClient; // Location Service のためのAPI private boolean mResolvingError = false; private FusedLocationProviderApi fusedLocationProviderApi; private LocationRequest locationRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 終了ボタンのリスナー登録 findViewById(R.id.buttonQuit).setOnClickListener(this); if (Build.VERSION.SDK_INT >= 23) { // Android 6.0以上なら許可を得る if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestLocationPermission(); // 許可を得る } } startPositioning(); // 測位の開始 } @Override protected void onPause() { super.onPause(); } private void requestLocationPermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS)) { ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION); } } // 許可リクエストの結果を受け取り @Override public void onRequestPermissionsResult(int requestCode, String[] permission, int[] grantResults) { if (requestCode == REQUEST_PERMISSION) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { startPositioning(); } } else { Toast toast = Toast.makeText(this, "許可取得に失敗しました", Toast.LENGTH_SHORT); toast.show(); } } // ConnectionCallbacks の メソッド @Override public void onConnected(Bundle connectionHint) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null && mLastLocation.getTime() > 20000) { LoggingLocationData(mLastLocation); } else { try { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this); Executors.newScheduledThreadPool(1).schedule(new Runnable() { @Override public void run() { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, MainActivity.this); } }, 60000, TimeUnit.MILLISECONDS); } catch (Exception e) { e.printStackTrace(); finish(); } } } @Override public void onLocationChanged(Location location) { LoggingLocationData(location); } @Override public void onConnectionSuspended(int cause) { } // OnConnectionFailedListenerのメソッド @Override public void onConnectionFailed(ConnectionResult result) { } @Override protected void onStart() { // MainActivity の開始 mGoogleApiClient.connect(); super.onStart(); } @Override protected void onStop() { mGoogleApiClient.disconnect(); super.onStop(); } @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.buttonQuit: // 終了ボタンがクリックされた stopFusedLocation(); finish(); break; } } // 位置情報収集を開始 private void startPositioning() { // Google API Clientのインスタンスを作成 if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(INTERVAL); locationRequest.setFastestInterval(FASTEST_INTERVAL); locationRequest.setSmallestDisplacement(1); // ???? fusedLocationProviderApi = LocationServices.FusedLocationApi; startFusedLocation(); } private void startFusedLocation() { if (mResolvingError != true) { mGoogleApiClient.connect(); } } private void stopFusedLocation() { mGoogleApiClient.disconnect(); } // 位置情報を記録する private void LoggingLocationData(Location location) { Toast toast = Toast.makeText(this, "(" + String.valueOf(location.getLatitude()) + " : " + String.valueOf(location.getLongitude() + ")"), // "Logging", Toast.LENGTH_SHORT); toast.show(); } }

###試したこと
ADBを用いて、エミュレータに対し、gpxファイルをから3秒に1件の位置データを送り、onLocationChanged()で受け取った位置情報を表示していますが、20件(1分)前後で表示が止まります。

###補足情報(言語/FW/ツール等のバージョンなど)
OS:ubuntu16.04
Android Studio:2.3.2; Emulator:26.03
JRE:1.8
Google Play services:40
Virtual Device:Android4.4 API Level19 + Google Api

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の箇所で60000ミリ秒後にリスナーを外す処理を行なっていますが、どのような意図で実装したのでしょうか?

Java

1Executors.newScheduledThreadPool(1).schedule

投稿2017/05/30 06:24

yona

総合スコア18155

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

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

nob.

2017/05/31 01:57

ご指摘の箇所を削除することで、1分の壁を破ることができました。 ありがとうございました。 ご指摘の部分は、ネットで参照した部分をほぼそのまま引用したので、内容や必要性をよく理解できていませんでした。 yonaさんのおかげで、前に進めることができます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問