Использование GoogleApiClient + LocationServices не обновляется
Я просто пытаюсь сделать простое приложение "учебник", чтобы получить местоположение моего телефона (чтобы узнать, как использовать его позже в каком-то другом приложении), но я просто не получаю нигде.
что я сделал
-
учебник для разработчиков Android: во-первых, я следил за учебником на сайте разработчика Android (developer.android.com/training/location/receive-location-updates.html).
как указано там, я использовал расположение, LocationClient и LocationRequest, инициализируя их (и настраивая их) в onCreate. LocationClient подключен и отключен в onStart и onStop.
я запрашиваю обновление местоположения после подключения (в onConnected). Я проверяю, что GooglePlayServices доступны перед выполнением этого вызова, и я все еще не получаю никаких обновлений в "onLocationChanged".
-
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 Maps, чтобы узнать, может быть, у меня что-то было, но он работает нормально.
проект
построить.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.API месте, но... Меня беспокоит, что это так сложно (предположительно, проще).
2 ответов
ошибка была только в том, что wifi не был включен... И я не понимал.
Что касается того, что сказал Грегм, если я прав, это старый API (большая часть его устарела прямо сейчас) и, как указано на сайте разработчика (https://developer.android.com/google/auth/api-client.html) Вы должны использовать GoogleApiClient как показано в моем исходном вопросе (и то же самое для обратных вызовов).
три обратного вызова:
public void onConnectionFailed(ConnectionResult arg0){}
public void onConnected(Bundle bundle){}
public void onConnectionSuspended(int arg0){}
должен быть реализован. Однако я не вижу onConnectionFailed
переопределяется. В этом случае компилятор должен был выдать ошибку. Их два LocationListener
для реализации LocationListener
и другие gms.location.LocationListener
. Вы можете проверить, используете ли Вы версию gms.
Я надеюсь, что Google обновит свой учебный образец кода для новой модели клиента и устранит дальнейшую путаницу.