使用GoogleApiClient + LocationServices不更新

时间:2014-07-30 22:17:08

标签: android location google-play-services android-location google-api-client

我只是想做一个简单的教程'应用程序来获取我的手机的位置(以便在以后的其他应用程序中学习如何使用它),但我没有到达任何地方。

我做了什么

  1. Android开发人员的教程:首先,我按照Android开发者网站上的教程(developer.android.com/training/location/receive-位置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)。< / p>

    如此处所示:https://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html,我使用GoogleApiClient并将其设置为LocationServices(也是https://stackoverflow.com/a/25013850/3802589)。那么我把它全部用来使用它,但我仍然没有得到任何关于该位置的更新。

  3. onLocationChanged如果有响应则应该打印。我还放了一个打印位置的按钮,或者什么都没有。

    说明

    我使用谷歌地图查看是否可能有一些关闭,但它的工作正常。

    项目

    的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但是...这让我感到困扰,这很难(据说更容易)。

2 个答案:

答案 0 :(得分:1)

三个回调:

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

必须实施。但是,我没有看到onConnectionFailed被覆盖。在这种情况下,编译器应该给出错误。有两个LocationListener实现,一个用于LocationListener,另一个用于gms.location.LocationListener。您可能想检查是否使用gms版本。

我希望Google能够将他们的培训示例代码更新为新的客户端模型,并消除进一步的混淆。

答案 1 :(得分:1)

错误只是因为wifi没有开启......我没有意识到。

至于GregM所说的,如果我说的是旧的API(现在大部分已被弃用),并且正如开发人员网站(https://developer.android.com/google/auth/api-client.html中所述),您必须使用GoogleApiClient,如我所示原始问题(和回调相同)。