getPlaceById() 无法 return Android google 地方的数据 API / resultCallback 未被调用
getPlaceById() fails to return data on Android google places API / resultCallback not getting called
我无法使用 Android 上的 Google 个地点 API 检索地点详细信息。我正在为特定的 place_id.
调用 getPlacyById()
在 Android activity 中,我设置了一个 googleApiClient 并调用了 connect()。 apiClient 连接成功。
然后出于测试目的,我使用硬编码 place_id 和 resultCallback 调用 getPlaceById()。但是,resultCallback 永远不会被调用。
硬编码的 place_id 通过 javascript(使用 javascript Google 映射 API)和 return 的有效数据进行测试。但是下面的 Java 代码无法 return 任何数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_activity_layout);
ButterKnife.inject(this);
if (getActionBar() != null) {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
if (mGoogleApiClient == null) {
rebuildGoogleApiClient();
}
.....
code_for_activity_init
.....
}
protected synchronized void rebuildGoogleApiClient() {
// When we build the GoogleApiClient we specify where connected and connection failed
// callbacks should be returned, which Google APIs our app uses and which OAuth 2.0
// scopes our app requests.
mGoogleApiClient = new GoogleApiClient.Builder(this)
//.enableAutoManage(this, 0 /* clientId */, this)
.addConnectionCallbacks(this)
.addApi(Places.GEO_DATA_API)
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
@Override
public void onConnected(Bundle bundle) {
// Successfully connected to the API client. Pass it to the adapter to enable API access.
//addressesAdapter.setGoogleApiClient(mGoogleApiClient);
Log.i("place api conn", "GoogleApiClient connected.");
}
@Override
public void onConnectionSuspended(int i) {
// Connection to the API client has been suspended. Disable API access in the client.
//mAdapter.setGoogleApiClient(null);
Log.e("place api conn", "GoogleApiClient connection suspended.");
}
@OnLongClick(R.id.one_more_request)
public boolean getDataAgain(){
Log.d("place", "getPlace By Id");
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
.getPlaceById(mGoogleApiClient, "ChIJIV6Mkke9oRQRcPq3KAx513M");
placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
return true;
}
private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
= new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
// Request did not complete successfully
Log.e("place", "Place query did not complete. Error: " + places.getStatus().toString());
return;
}
// Get the Place object from the buffer.
final Place place = places.get(0);
// Format details of the place for display and show it in a TextView.
//mPlaceDetailsText.
Toast.makeText(MyActivity.this,/*setText(*/
formatPlaceDetails(getResources(), place.getName(),
place.getId(), place.getAddress(), place.getPhoneNumber(),
place.getWebsiteUri()), Toast.LENGTH_LONG).show();
Log.i("place", "Place details received: " + place.getName());
}
};
此问题与 类似,但我已检查我的 AndroidManifest 是否已包含所需的权限
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
最终,我希望每次用户从自动完成地址字段中选择项目时调用 getPlaceById()。
***** 更新 *******
找到解决方案。我错过了两件事。首先,将地图v2.API_KEY复制粘贴为geo.API_KEY(并确保删除地图。v2.API_KEY,因为不能指定两次)
android:name="com.google.android.maps.v2.API_KEY" android:value="whatEverGoogleMapsApiKeyYouHave"
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
其次,我必须为 Android
启用 Google Places API
我错过了两件事。
首先 com.google.android.geo.API_KEY 与 com.google.android.maps.v2.API_KEY 相同。只需将 API KEY 复制粘贴到 AndroidManifest 文件中。
android:name="com.google.android.maps.v2.API_KEY" android:value="whatEverGoogleMapsApiKeyYouHave"
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
我还缺少 google 控制台上 Android 服务的 Google 位置 API。如果您启用了 Google Places API,请注意,这还不够,因为它只是一个不同的 API。您必须转到 google 控制台并明确启用 Google Places API for Android.
****** 编辑 ********
正如@Lissy 指出的那样,从 SDK 21 开始,定义相同的 API_KEY 两次会报错。保留 geo.API_KEY 就足够了
这正是我一直在努力解决的问题。在 Android Studio 中,当我添加第二个 API 键时,我收到了一个异常:
Caused by: java.lang.RuntimeException: The API key can only be specified once.
只需将 "com.google.android.geo.API_KEY" 元数据条目添加到清单文件并删除其中一个映射即可解决此问题。
更新 SDK 21
如果您同时包含两个元数据,您将收到以下错误:
Caused by: java.lang.RuntimeException: The API key can only be specified once.
而是只包含地理 API 键:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
而不是地图
我无法使用 Android 上的 Google 个地点 API 检索地点详细信息。我正在为特定的 place_id.
调用 getPlacyById()在 Android activity 中,我设置了一个 googleApiClient 并调用了 connect()。 apiClient 连接成功。
然后出于测试目的,我使用硬编码 place_id 和 resultCallback 调用 getPlaceById()。但是,resultCallback 永远不会被调用。
硬编码的 place_id 通过 javascript(使用 javascript Google 映射 API)和 return 的有效数据进行测试。但是下面的 Java 代码无法 return 任何数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_activity_layout);
ButterKnife.inject(this);
if (getActionBar() != null) {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
if (mGoogleApiClient == null) {
rebuildGoogleApiClient();
}
.....
code_for_activity_init
.....
}
protected synchronized void rebuildGoogleApiClient() {
// When we build the GoogleApiClient we specify where connected and connection failed
// callbacks should be returned, which Google APIs our app uses and which OAuth 2.0
// scopes our app requests.
mGoogleApiClient = new GoogleApiClient.Builder(this)
//.enableAutoManage(this, 0 /* clientId */, this)
.addConnectionCallbacks(this)
.addApi(Places.GEO_DATA_API)
.build();
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
@Override
public void onConnected(Bundle bundle) {
// Successfully connected to the API client. Pass it to the adapter to enable API access.
//addressesAdapter.setGoogleApiClient(mGoogleApiClient);
Log.i("place api conn", "GoogleApiClient connected.");
}
@Override
public void onConnectionSuspended(int i) {
// Connection to the API client has been suspended. Disable API access in the client.
//mAdapter.setGoogleApiClient(null);
Log.e("place api conn", "GoogleApiClient connection suspended.");
}
@OnLongClick(R.id.one_more_request)
public boolean getDataAgain(){
Log.d("place", "getPlace By Id");
PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi
.getPlaceById(mGoogleApiClient, "ChIJIV6Mkke9oRQRcPq3KAx513M");
placeResult.setResultCallback(mUpdatePlaceDetailsCallback);
return true;
}
private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback
= new ResultCallback<PlaceBuffer>() {
@Override
public void onResult(PlaceBuffer places) {
if (!places.getStatus().isSuccess()) {
// Request did not complete successfully
Log.e("place", "Place query did not complete. Error: " + places.getStatus().toString());
return;
}
// Get the Place object from the buffer.
final Place place = places.get(0);
// Format details of the place for display and show it in a TextView.
//mPlaceDetailsText.
Toast.makeText(MyActivity.this,/*setText(*/
formatPlaceDetails(getResources(), place.getName(),
place.getId(), place.getAddress(), place.getPhoneNumber(),
place.getWebsiteUri()), Toast.LENGTH_LONG).show();
Log.i("place", "Place details received: " + place.getName());
}
};
此问题与
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
最终,我希望每次用户从自动完成地址字段中选择项目时调用 getPlaceById()。
***** 更新 ******* 找到解决方案。我错过了两件事。首先,将地图v2.API_KEY复制粘贴为geo.API_KEY(并确保删除地图。v2.API_KEY,因为不能指定两次)
android:name="com.google.android.maps.v2.API_KEY" android:value="whatEverGoogleMapsApiKeyYouHave"
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
其次,我必须为 Android
启用 Google Places API我错过了两件事。
首先 com.google.android.geo.API_KEY 与 com.google.android.maps.v2.API_KEY 相同。只需将 API KEY 复制粘贴到 AndroidManifest 文件中。
android:name="com.google.android.maps.v2.API_KEY" android:value="whatEverGoogleMapsApiKeyYouHave"
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
我还缺少 google 控制台上 Android 服务的 Google 位置 API。如果您启用了 Google Places API,请注意,这还不够,因为它只是一个不同的 API。您必须转到 google 控制台并明确启用 Google Places API for Android.
****** 编辑 ******** 正如@Lissy 指出的那样,从 SDK 21 开始,定义相同的 API_KEY 两次会报错。保留 geo.API_KEY 就足够了
这正是我一直在努力解决的问题。在 Android Studio 中,当我添加第二个 API 键时,我收到了一个异常:
Caused by: java.lang.RuntimeException: The API key can only be specified once.
只需将 "com.google.android.geo.API_KEY" 元数据条目添加到清单文件并删除其中一个映射即可解决此问题。
更新 SDK 21
如果您同时包含两个元数据,您将收到以下错误:
Caused by: java.lang.RuntimeException: The API key can only be specified once.
而是只包含地理 API 键:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="whatEverGoogleMapsApiKeyYouHave"/>
而不是地图