web-dev-qa-db-ja.com

GoogleApiClient + LocationServicesを使用しても更新されない

私は単純な「チュートリアル」アプリを実行して私の電話の位置を取得しようとしています(後で他のアプリでそれを使用する方法を学習するため)が、どこにも行きません。

私がやったこと

  1. Androidデベロッパーチュートリアル:まず、Androidデベロッパーサイト(developer.Android.com/training/location/receive-location-updates .html)。

    そこに示されているように、Location、LocationClient、およびLocationRequestを使用して、onCreateでそれらを初期化(および設定)しました。 LocationClientは、onStartおよびonStopで接続および切断されます。

    (onConnectedで)接続した後、位置情報の更新をリクエストしています。この呼び出しを行う前に、GooglePlayServicesが利用可能であることを確認しましたが、「onLocationChanged」の更新はまだ取得されていません。

  2. GoogleApiClient:LocationClientは非推奨であり、LocationServicesが推奨されていることに気付きました(developer.Android.com/reference/com/google/Android/gms/location/LocationClient .html)。

    ここに示すように: https://developer.Android.com/reference/com/google/Android/gms/location/FusedLocationProviderApi.html 、GoogleApiClientを使用してLocationServicesに設定します(また- https://stackoverflow.com/a/25013850/3802589 )。それで、これを使用するようにすべてを設定しましたが、それでも場所の更新を取得していません。

onLocationChangedは、応答がある場合に出力する必要があります。場所や「何もない」を印刷するボタンも配置しました。

備考

Googleマップを使用して、何か問題があったかどうかを確認しましたが、問題なく動作しました。

事業

build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.Android.gms:play-services:5.0.77'
    compile "com.Android.support:support-v4:20.0.+"
}

マニフェスト

...
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
...
<meta-data Android:name="com.google.Android.gms.version"
            Android:value="@integer/google_play_services_version" />
...

コード

public class MyActivity extends Activity  implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    private GoogleApiClient mLocationClient;
    private Location mCurrentLocation;
    LocationRequest mLocationRequest;

    ...
    /* Constant fields - request interval */
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        mLocationClient = new GoogleApiClient.Builder(getApplicationContext())
                                .addApi(LocationServices.API)
                                .addConnectionCallbacks(this)
                                .addOnConnectionFailedListener(this)
                                 .build();

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

    }

    @Override
    protected void onStart() {
        super.onStart();
        mLocationClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();

        LocationServices.FusedLocationApi.removeLocationUpdates(mLocationClient, this);

        mLocationClient.disconnect();
    }

    public void onClick(View view) {

        if (mCurrentLocation != null) {
            Log.i("Location", mCurrentLocation.toString());
        } else {
            Log.i("Location", "nothing");
        }

    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d("Location Update", "CHANGED");
        mCurrentLocation = location;
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Display the connection status
        Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
        if(servicesConnected()) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        Toast.makeText(this, "Disconnected. Please re-connect.",
                Toast.LENGTH_SHORT).show();
    }

logcat

8948-8948/example.Android.com.test D/Location Updates﹕ Google Play services is available.
8948-8948/example.Android.com.test I/Location﹕ nothing

本当にシンプルなものを忘れているように感じるかもしれません...しかし、私はそれを見ることができず、単純な場所を取得するために多くの時間を費やしました...

Android.location APIだけを使用することもできますが、これは非常に難しい(おそらく簡単な)ことに悩まされます。

12
TomDT

間違いは無線LANがオンになっていないということだけでした...そして私は気付かなかった。

GregMの発言に関して、私が正しければ、それは古いAPI(ほとんどが現在非推奨)であり、開発者のサイト( https://developer.Android.com/google/auth/api -client.html )元の質問に示されているように、GoogleApiClientを使用する必要があります(コールバックについても同じです)。

1
TomDT

3つのコールバック:

public void onConnectionFailed(ConnectionResult arg0){}
public void onConnected(Bundle bundle){}
public void onConnectionSuspended(int arg0){}

実装する必要があります。ただし、onConnectionFailedが上書きされることはありません。この場合、コンパイラはエラーを表示するはずです。 2つのLocationListener実装があり、1つはLocationListener用で、もう1つはgms.location.LocationListener。 gmsバージョンを使用しているかどうかを確認することをお勧めします。

Googleがトレーニングサンプルコードを新しいクライアントモデルに更新し、さらなる混乱を解消してくれることを願っています。

1
GregM