teratail header banner
teratail header banner
質問するログイン新規登録
Android

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

Q&A

解決済

2回答

2338閲覧

【Android】位置情報取得を瞬時に取りたい

tomoyuki123

総合スコア273

Android

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

0グッド

0クリップ

投稿2016/08/26 15:11

0

0

locationlistenerを使って位置情報を取得しています。

ただonLocationChangedメソッドが呼ばれるのが遅く、端末によっては20~30秒ほどかかります。
これをもっと精度は低くてもいいのですがもっと早く取る方法は何かないでしょうか?

バージョンはAndroid4.4以上を対応しないといけないです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

少しでも早く位置情報を取得したい場合は
(1)複数のProvider(GPSとネットワーク)を登録しておく。
(2)getLastKnownLocation()を使う。
などの方法がございます。

http://ria10.hatenablog.com/entry/20121109/1352470160
にサンプルコードなども書かれているのでご参考にされては
いかがでしょうか?
private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix

  • @param location The new Location that you want to evaluate

  • @param currentBestLocation The current Location fix, to which you want to compare the new one
    */
    protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
    // A new location is always better than no location
    return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location
    // because the user has likely moved
    if (isSignificantlyNewer) {
    return true;
    // If the new location is more than two minutes older, it must be worse
    } else if (isSignificantlyOlder) {
    return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
    currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
    return true;
    } else if (isNewer && !isLessAccurate) {
    return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
    return true;
    }
    return false;
    }

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}

投稿2016/08/26 18:42

Yatsurugi

総合スコア1630

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

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

tomoyuki123

2016/09/02 03:31

ありがとうございました。ただ端末によってはやはり求める速さにならず、これはもうしょうがないかなとあきらめて頂きました。
guest

0

locationlistenerを使って位置情報を取得

どのようにやっているのでしょうか?具体的なコード、使用しているAPIを出しましょう

FusedLocationProviderApi
を使えば精度は落ちますが、GPSだけよりも一般的に早く測位できます

FusedLocationProviderApi を使って位置情報を取得

投稿2016/08/26 15:46

aja

総合スコア3733

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

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

tomoyuki123

2016/09/02 03:29

FusedLocationProviderApi 知らなかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問