###前提・実現したいこと
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/31 01:57