私は単純な「チュートリアル」アプリを実行して私の電話の位置を取得しようとしています(後で他のアプリでそれを使用する方法を学習するため)が、どこにも行きません。
Androidデベロッパーチュートリアル:まず、Androidデベロッパーサイト(developer.Android.com/training/location/receive-location-updates .html)。
そこに示されているように、Location、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マップを使用して、何か問題があったかどうかを確認しましたが、問題なく動作しました。
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だけを使用することもできますが、これは非常に難しい(おそらく簡単な)ことに悩まされます。
間違いは無線LANがオンになっていないということだけでした...そして私は気付かなかった。
GregMの発言に関して、私が正しければ、それは古いAPI(ほとんどが現在非推奨)であり、開発者のサイト( https://developer.Android.com/google/auth/api -client.html )元の質問に示されているように、GoogleApiClientを使用する必要があります(コールバックについても同じです)。
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がトレーニングサンプルコードを新しいクライアントモデルに更新し、さらなる混乱を解消してくれることを願っています。