【问题标题】:Using GoogleApiClient + LocationServices not updating使用 GoogleApiClient + LocationServices 不更新
【发布时间】:2014-09-22 17:59:09
【问题描述】:

我只是在尝试做一个简单的“教程”应用程序来获取我手机的位置(以便稍后在其他应用程序中学习如何使用它),但我什么也没有。

我做了什么

  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 如果有响应,它应该打印出来。我还放了一个打印位置或“无”的按钮。

备注

我使用谷歌地图查看了是否有什么问题,但它工作得很好。

项目

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();
    }

日志猫

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,但是……这太难了(据说更容易),这让我很困扰。

【问题讨论】:

  • 它使用高精度请求。这意味着它需要 GPS。你确定你有锁定GPS?如果您正在调试,您可能在室内,这往往不起作用。 GPS 图标是完全不亮、亮但闪烁,还是亮且常亮?
  • :'( 是的,实际上它在倾斜......虽然,显然我的 wifi 连接不是“真实的”,因为有一个我没有注意到的身份验证过程,所以基本上我没有连接(访问网站,但可能没有其他功能?)。我只是用两台设备试了一下,并正常获得了更新(经过身份验证),而另一台没有……是的,我在室内,所以也许这就是我得到倾斜 GPS 的原因,但正如我所读到的,HIGH_ACCURACY 不需要它(但很可能)-preview.tinyurl.com/k6ew5uv 无论如何,谢谢!
  • 来自该链接:“PRIORITY_HIGH_ACCURACY 更有可能使用 GPS”所以是的,它使用 GPS。在某些情况下可能不会,但在其他情况下肯定会。
  • 啊,是的,我只是在想为什么它仍然只能使用 wifi :)

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


【解决方案1】:

错误只是wifi没有打开......我没有意识到。

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

【讨论】:

  • 我和你犯了一个类似的错误——我没有在我的模拟器上打开 GPS。很容易忘记在那里打开 GPS,即使在模拟器中没有打开 GPS,Genymotion 似乎也会在通知栏上显示位置图标。
  • 嗨,你能告诉我你上面的代码有什么问题吗?我这里也有同样的问题。我的 Wifi 和 GPS 都打开了。谢谢
【解决方案2】:

三个回调:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多