0
GoogleApiClient
を使用してAndroidアプリに位置情報を取得する方法についてはGoogleのチュートリアルに従っていますが、クライアントを構築して接続しようとすると問題が発生します。クライアントが接続しようとしていますが、onConnected()
でもonConnectionFailed()
コールバックも呼び出されません。したがって、クライアントは決して接続を確立したり、失敗したことを報告したりしません。私はここで何が欠けていますか?AndroidのGoogleApiClientのonConnect()コールバックは決して呼び出されません
更新日:ロケーションにアクセスするためのアクセス許可チェックが追加されました。
public class MainActivity extends AppCompatActivity
implements OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener {
public static final String LOG_TAG = MainActivity.class.getSimpleName();
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
private final static int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 0;
private Location mCurrentLocation = new Location("default");
private GoogleApiClient mGoogleApiClient = null;
private Location mLastLocation = null;
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
Log.e("Connected: ", String.valueOf(mGoogleApiClient.isConnected()));
mGoogleApiClient.connect();
Log.e("Connected: ", String.valueOf(mGoogleApiClient.isConnected()));
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// check if permissions are granted
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
}
@Override
protected void onStop() {
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
super.onStop();
}
private void handleNewLocation(Location location) {
Log.d(LOG_TAG, location.toString());
}
@Override
public void onConnected(@Nullable Bundle bundle) {
try {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation == null) {
}
else {
handleNewLocation(mLastLocation);
}
} catch (SecurityException e) {
DialogFragment mlocationDialog = new LocationDialogFragment();
mlocationDialog.show(getSupportFragmentManager(), "locationDialog");
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
try {
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else {
Log.i(LOG_TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
}
}
はい、私はそれを試してみましたが、権限がすでに付与されていることがわかったので、それは問題ではありませんでした。 – martasd
手動で接続を管理する場合は、アプリケーションのライフサイクルの適切な時点でconnect()メソッドとdisconnect()メソッドを呼び出す必要があります。アクティビティのコンテキストでは、アクティビティのonStart()メソッドでconnect()を呼び出し、アクティビティのonStop()メソッドでdisconnect()を呼び出すことをお勧めします。 connect()メソッドとdisconnect()メソッドは、自動的に管理された接続を使用するときに自動的に呼び出されます。 –