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

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

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

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

Android

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

Q&A

解決済

1回答

4258閲覧

GPS検索の中止処理を実装方法を教えてください

izuki_y

総合スコア65

GPS

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

Android

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

0グッド

1クリップ

投稿2016/07/12 14:54

いつもお世話になっています。
Android で GPS 検索を行うシステムの勉強をしています。
LocationManager の requestLocationUpdates を行い現在の位置を検索しています。
これを5秒検索して見つからなければremoveUpdatesを呼んで終了としたいです。

new Handler()).postDelayed(new Runnable(){...}); を使ってみましたが上手くいきません。
ご教授お願いします。

環境

  • Windows7 32bit Pro
  • Android Studio 2.1.1
  • APIレベル 19

java

1public class MainActivity extends Activity { 2 private static final String TAG = "GPS"; 3 private Button btn; 4 private LocationManager mLocationManager; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 // ボタン 12 btn =(Button)findViewById(R.id.gps_btn); 13 btn.setOnClickListener(new OnClickListener(){ 14 15 @Override 16 public void onClick(View v) { 17 onBtnGpsClicked(v); 18 } 19 }); 20 21 // GPS 22 mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 23 boolean gpsFlg = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 24 Log.d(TAG, "GPS Enabled" + (gpsFlg?"OK":"NG") ); 25 } 26 27 // GPSボタン 28 public void onBtnGpsClicked(View view){ 29 mLocationManager.requestLocationUpdates( 30 LocationManager.GPS_PROVIDER, 31 3000, // 通知のための最小時間間隔(ミリ秒) 32 10, // 通知のための最小距離間隔(メートル) 33 new LocationListener(){ 34 35 @Override 36 public void onLocationChanged(Location location) { 37 String msg = "Lat" + location.getLatitude() 38 + "\nLng" + location.getLongitude(); 39 Log.d(TAG, msg); 40 mLocationManager.removeUpdates(this); 41 } 42 43 @Override 44 public void onProviderDisabled(String provider) { 45 Log.d(TAG, "onProviderDisabled"); 46 } 47 @Override 48 public void onProviderEnabled(String provider) { 49 Log.d(TAG, "onProviderEnabled"); 50 } 51 @Override 52 public void onStatusChanged(String provider, int status, 53 Bundle extras) { 54 Log.d(TAG, "onStatusChanged"); 55 } 56 57 }); 58 } 59 60 6162

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の方法はどうでしょうか。
・onBtnGpsClickedメソッドで、位置情報取得を依頼した後、handlerに「LocationManagerからLocationListnerを削除する」(Runnable)を登録する。
・onLocationChangedメソッドで、一度HandlerからRunnableを削除し、位置情報を処理した後に再度HandlerへRunnableを登録する。
これにより、位置情報が更新され続ける間は位置情報の取得が行われ、Handlerに設定した一定時間位置情報の更新がなければ、位置情報の取得が止まります。

※匿名クラスをActivityで継承させていますが、やっていることは変わりません。

public class MainActivity extends AppCompatActivity implements LocationListener, Runnable { private static final String TAG = "GPS"; private LocationManager mLocationManager; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ボタン Button btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBtnGpsClicked(v); } }); // GPS mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean gpsFlg = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); Log.d(TAG, "GPS Enabled " + (gpsFlg ? "OK" : "NG")); } // GPSボタン public void onBtnGpsClicked(View view) { Log.d(TAG, "onBtnGpsClicked"); try { mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 3000, // 通知のための最小時間間隔(ミリ秒) 10, // 通知のための最小距離間隔(メートル) this); } catch (SecurityException e) { e.printStackTrace(); } handler.postDelayed(this, 5000); } @Override public void onLocationChanged(Location location) { handler.removeCallbacks(this); String msg = "Lat" + location.getLatitude() + "\nLng" + location.getLongitude(); Log.d(TAG, msg); handler.postDelayed(this, 5000); } @Override public void onProviderDisabled(String provider) { Log.d(TAG, "onProviderDisabled"); } @Override public void onProviderEnabled(String provider) { Log.d(TAG, "onProviderEnabled"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d(TAG, "onStatusChanged"); } @Override public void run() { Log.d(TAG, "run"); try { mLocationManager.removeUpdates(this); } catch (SecurityException e) { e.printStackTrace(); } } }

投稿2016/07/12 17:57

dsuzuki

総合スコア1682

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

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

izuki_y

2016/07/22 15:43

回答ありがとうございます。 Handler.postDelayed()でXXX秒後に removeUpdates を行うには 匿名クラスにして実装するのではなく、 Activity のクラスに LocationListener を implements しないと駄目なのですね( removeUpdates を呼び出せない) 実装例まで頂き本当にありがとうございます。 「Handler.postDelayed()でXXX秒後に○○する」と言った方法は今後も役に立ちそうなのでしっかり覚えたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問